- 第一想法:用二分法,左闭右闭的区间规则,while条件为left <= right,因为left == right时也需要检查
-
看完代码随想录之后的想法:有 两种区间规则: 左闭右开,左闭右闭
-
左闭右开:[left, right),所以在更新right范围时,可以直接right = mid,而不是right = mid-1,因为right), mid不会被考虑
class Solution { public int search(int[] nums, int target) { int i=0, j=nums.length; while (i<j) { int mid = i+(j-i)/2; if (nums[mid]==target) return mid; else if (nums[mid] < target) i = mid+1; else j = mid; } return -1; } }
-
35.搜索插入位置
- 第一想法:用二分法,左闭右开的区间规则,while条件为left < right
-
class Solution { public int searchInsert(int[] nums, int target) { int l = 0; int r = nums.length; while (l<r) { int mid = l+(r-l)/2; if (nums[mid]==target) { return mid; } else if (nums[mid] > target) { r = mid; } else { l = mid+1; } } return l; } }
-
看完代码随想录之后的想法:补充了另一种 区间规则: 左闭右闭,return的是j+1
-
class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; // 定义target在左闭右闭的区间,[low, high] int low = 0; int high = n - 1; while (low <= high) { // 当low==high,区间[low, high]依然有效 int mid = low + (high - low) / 2; // 防止溢出 if (nums[mid] > target) { high = mid - 1; // target 在左区间,所以[low, mid - 1] } else if (nums[mid] < target) { low = mid + 1; // target 在右区间,所以[mid + 1, high] } else { // 1. 目标值等于数组中某一个元素 return mid; return mid; } } // 2.目标值在数组所有元素之前 3.目标值插入数组中 4.目标值在数组所有元素之后 return right + 1; return high + 1; } }
34. 在排序数组中查找元素的第一个和最后一个位置
- 第一想法:双指针法
- 但我设置的指针为i=0, j=nums.length-1,不是从两头遍历,应该是快慢指针,都从0开始
- 看完代码随想录之后的想法:暴力写法,相向双指针法
- 补充了暴力写法,两个for loop,保证相对位置
- 相向双指针法,要在开头和最后更新右位置
-
class Solution { public int removeElement(int[] nums, int val) { int i=0, j=nums.length-1; // 这里的while!! while (j>=0 && nums[j]==val) j--; while (i<=j) { if (nums[i]==val) { nums[i]=nums[j]; j--; } i++; // 这里的while!! while (j>=0 && nums[j]==val) j--; } return i; } }