这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战。
题目描述:
599. 两个列表的最小索引总和 - 力扣(LeetCode) (leetcode-cn.com)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例一
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例二
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假设
nums中的所有元素是不重复的。 n将在[1, 10000]之间。nums的每个元素都将在[-9999, 9999]之间。
思路分析
二分查找
有序数组,找某个数,这应该算是非常标准的二分查找了。
二分法的一般过程就是
- 设定查找区间
- 取中值,并与我们的target作比较
- 根据比较结果,移动指针
二分查找现在基本都是很成熟的解法了,同时也有多种模板,如果熟练的话可以直接套用。
二分查找的难点就是要注意下 循环条件 以及 加一减一 上。
AC代码
class Solution {
fun search(nums: IntArray, target: Int): Int {
var left = 0
var right = nums.size
while (left < right) {
val mid = ((right - left) ushr 1) + left
when {
target == nums[mid] -> return mid
target < nums[mid] -> right = mid
else -> left = mid + 1
}
}
return -1
}
}
总结
二分法不难,难的就是边界情况等,我觉得这个老哥讲的非常详细,大家可以看看。
参考
二分查找 - 二分查找 - 力扣(LeetCode) (leetcode-cn.com)