No.35 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
来源:力扣(LeetCode)
链接:LeetCode No.35 搜索插入位置
题解:二分查找
由题意可知,给定一个数,我们需要在一个已经排序好了的数组中找到可以插入这个数的位置并返回,因此重点就在查找位置这个点,我使用了二分查找的方法实现本题,来,放代码:
class Solution {
public int searchInsert(int[] nums, int target) {
if (nums.length == 0)return 0;
int i = 0;
int left = 0;
int right = nums.length - 1;
int mid = 0;
while (nums[left] <= nums[right]) {
mid = (left + right) / 2;
if (nums[mid] >= target)
right = mid;
else
left = mid + 1;
}
if (nums[left] >= target) return left;//此处left、right和left都可以,因为值都是相等的。
else return left + 1;
}
}
执行信息如下:
不过我看了看官方题解和其他人代码,发现我的二分查找的代码好像有点怪怪的
官方题解
代码如下:
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int left = 0, right = n - 1, ans = n;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
}
来源:力扣(LeetCode)
我注意到了一些我没见过的操作: >> , << , >>>
经过查阅,我得知这个是位操作,涉及二进制、原码、补码、反码这些
- << 的意思为左移,不分正负数,低位补0
- >> 的意思右移,如果该数为正,则高位补0,若为负数,则高位补1
- >>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
不过这道题中的 "<<1"的意思相当于乘以2
拓展:>> 1 相当于除以2。
>>> 不考虑高位的正负号,正数的 >>> 等同于 >>
总结
本题使用二分查找即可解决问题,另外注意代码规范,可以参考官方答案看看位操作的方法。