Leecode 704二分查找
题目链接:https://leetcode.cn/problems/binary-search/
题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
题目解法
思路:
题目前提是数组为有序数组,数组中无重复元素(否则使用二分法时返回元素下表可能不是唯一的)。写二分法最重要的是把区间定义清楚,区间的定义就是不变量,在二分查找的时候保持不变量,在用while循环的时候坚持区间的定义来操作(循环不变量原则)。在二分法中,一般有两种定义方式,左闭右闭([left,right]),左闭右开([left,right))。
第一种———[left,right]
我们定义target在一个左闭右闭的区间——[left,right],代码如下
while(left<=right)//使用left<=right是因为区间左闭右闭,存在left=right的时候。
if (nums[middle]>target){right=middle-1};//因为nums[middle]>target,所以target一定不等于middle且在区间左边,所以right=middle-1。
第二种———[left,right)
while(left<right)//使用left<=right是因为区间左闭右开,不存在left=right的时候。
if (nums[middle]>target){right=middle-1};//因为nums[middle]不等于target且在区间左边,所以right=middle。
else if(nums[middle]<target){left=middle+1};//因为左闭。
总结
在二分查找中,通过不断调整左指针和右指针,使得查找区间逐渐缩小,最终当中间元素等于目标值时,此时middle=目标值在数组中的下标。
Leecode 27移除元素
题目链接:https://leetcode.cn/problems/remove-element/
题目描述
题目解法
思路:
数组元素不能删除,只能覆盖
暴力解法
两层for循环,一个for循环遍历数组元素,另一个for循环用来更新数组。
假设nums=[3,2,2,3],val=3.
初始size=4.第一次循环i=0,nums[0]=3等于val,进入循环将nums[1]覆盖到nums[0],nums变为[2,2,2,3],后i=-1,size=3。第二次循环nums[1]=2不等于val,i=1,第三次循环i=2,一直循环直到第五次,循环结束size=2。
双指针解法
通过一个快指针和满指针在一个for循环下完成两个for循环的工作。
把快指针所获取的值赋给慢指针所在的位置,快指针用来获取新数组中的元素,满指针获取新数组需要更新的位置。快指针每次都+1,慢指针看情况加一(当需要移除的值与快指针相等时,慢指针不变)。
Leecode 977有序数组的平方
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
题目描述
题目解法
思路:
1、每个数平方后再排序 2、双指针
暴力排序
双指针
原本数组有序,但是负数平方后可能会成为最大值,所以数组平方后最大值一定在数组两边,定义一个新数组result和A数组一样的大小,让K指向result数组终止位置。