解决思路
代码
public int search(int[] nums, int target) { int l = 0; int r = nums.length - 1; while(l <= r){ // 注意点一 int mid = l + (r-l)/2; if(nums[mid] > target){ r = mid - 1; // 注意点二 }else if(nums[mid] < target){ l = mid + 1; }else{ return mid; } } return -1; }
注意点
扩展
当元素可重复时,如何定位到与target相等的最小索引
public static int search(int[] nums, int target) { int l = 0; int r = nums.length - 1; while(l <= r){ int mid = l + (r-l)/2; if(nums[mid] >= target){ // 等于target的时候 右指针继续移动,继续寻找最左边的一个 // 如果已达最左的一个,再循环左指针会移动,最终会大于r,取到最左的 r = mid - 1; }else if(nums[mid] < target){ l = mid + 1; } } // 会存在找不到与target相等的情况 if(nums.length == l || nums[l] != target){ return -1; } return l; }
解决思路
代码
public int removeDuplicates(int[] nums) { // 只允许元素出现一次的情况 int k = 1; int fast = k; int slow = k; // 注意点一 while(fast < nums.length){ if(nums[fast] != nums[fast-k]){ // 注意点二 nums[slow] = nums[fast]; slow++; } fast ++; } return slow; }
注意点
同类型题目
解决思路
代码
public int[] sortedSquares(int[] nums) { int[] res = new int[nums.length]; int l = 0; int r = nums.length-1; int index = nums.length - 1; while(l <= r){ if(Math.abs(nums[l]) > Math.abs(nums[r])){ res[index] = (int)Math.pow(nums[l],2); l++; }else{ res[index] = (int)Math.pow(nums[r],2); r--; } index --; } return res; }
注意点
扩展
想再节省空间的话,可以比较两个数的平方后,进行交换,右指针一直往前移即可
public int[] SortedSquares(int[] nums) { int left = 0; int right = nums.length-1; int leftR = 0, rightR = 0; while(right >= 0){ leftR = nums[left]*nums[left]; rightR = nums[right]*nums[right]; // 左指针的平方比较大,交换到数组的后面来 if(leftR >= rightR){ nums[left] = nums[right]; nums[right] = leftR; }else{ nums[right] = rightR; } right--; } return nums; }