题目:35 搜索插入位置(easy)
一、题目
Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You must write an algorithm with O(log n) runtime complexity.
Example 1:
Input: nums = [1,3,5,6], target = 5
Output: 2
Example 2:
Input: nums = [1,3,5,6], target = 2
Output: 1
Example 3:
Input: nums = [1,3,5,6], target = 7
Output: 4
Constraints:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums contains distinct values sorted in ascending order.
-104 <= target <= 104
二、 思路
有序数组+没有重复元素。二分查找,对半找就完事儿了。
改变1:然后二分查找最开始判断越界的结果要改变,假如说target比最小的还小,那就在最前面插入;假如说target比最大的还大,那就在最后面插入。
改变2:假如说最后找不到,要返回的是left,也就是说最小的位置插入,而不是返回mid。
二、自己写的
1.代码
第一次写
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int mid = 0;
if (nums[left] > target)
return 0;
else if (nums[right] < target)
return nums.length;
while (left <= right) {
mid = (left + right) / 2;
if (nums[mid] > target)
right = mid - 1;
else if (nums[mid] < target)
left = mid + 1;
else
return mid;
}
return mid;
}
}
//错误1:假如说最后找不到,要返回的是left或者right+1(很简单,自己找个情况一画就能知道)
第二次写
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int mid = 0;
if (nums[left] > target)
return 0;
else if (nums[right] < target)
return nums.length;
while (left <= right) {
mid = (left + right) / 2;
if (nums[mid] > target)
right = mid - 1;
else if (nums[mid] < target)
left = mid + 1;
else
return mid;
}
// return right + 1;
return left;
}
}
//正确,把最后的return mid改成return left或者return right + 1
三、标准答案
1.方法一(左闭右闭)
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
int mid = 0;
if (nums[left] > target)
return 0;
else if (nums[right] < target)
return nums.length;
while (left <= right) {
//注意写法,mid = (left + (right - left)) >> 1;错了,只需要把后面除二就行了
mid = left + ((right - left) >> 1);
if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
else
return mid;
}
return right + 1;
//return left;
}
}
2.方法二(左闭右开)
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length;
int mid = 0;
if (nums[left] > target)
return 0;
else if (nums[right - 1] < target)
return right;
while (left < right) {
mid = left + ((right - left) >> 1);
if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
else
return mid;
}
//return right;
return left;
}
}
3.总结
左闭右开和左开右闭就看当时right是咋定义的,然后根据定义,下面不同情况对应不同情况,注释写的很明白,以后就按这个来。
这个题得再加上最后找不到的时候返回啥(return的不是-1),找个例子,写一下就知道了。