- 第一题二分查找
简答回答:经典的二分查找,采用的是左闭右闭区间,主要需要注意的就是右区间的下标
代码如下:class Solution { public int search(int[] nums, int target) { int left = 0;//左下标 int right = nums.length-1;//右下标 //循环条件 while(left<=right){ //二分查找点 int mid = (left+right)/2; if(nums[mid]==target){ return mid; }else if(nums[mid]<target){ left++; }else{ right--; } } //没找到返回-1 return -1; } }
- 第二题移除目标元素
简要回答:因为题目不用在意前k个元素之后的元素,也不要求前k个元素的顺序,所以可以采用双指针解法,把前指针需要移除的元素用后指针满足条件的值直接覆盖
注意:考虑到数组元素全都是目标元素,需要注意右指针查找满足条件元素时的下标,主要就是注意循环条件的下标
代码:class Solution { public int removeElement(int[] nums, int val) { int k = 0; int left = 0; int right = nums.length-1; //循环条件,带等号是因为k++是后加 while(left<=right){ if(nums[left]!=val){ k++; left++; }else{ //查找时循环条件 while(right>=left){ if(nums[right]==val){ right--; }else{ nums[left]=nums[right]; right--; break; } } } } return k; } }
- 第三题 有序数组的平方
简要回答:我使用的是直接把平方加入到新数组然后对新数组进行排序
一个新思路:题目数组是非递减的,可以采用双指针比较两端平方的大小,对新数组从后往前进行赋值