Day1
为了督促自己学习,购买了一年力扣会员,希望可以增加一些学习成本,让我坚持下去。
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的
target,如果目标值存在返回下标,否则返回 -1。示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4
示例 2:输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。 n 将在 [1, 10000]之间。 nums 的每个元素都将在 [-9999,
9999]之间。
写在前面
首先,相信大家对二分查找并不陌生,大二的数据结构课程中老师一定重点讲解过其中思想。但今天实操的时候却发生了很多意想不到的错误。眼高手低这个词语应用到我身上是如此地贴切。
思路
对于一个有序整型且无重复数组,进行查找其中某值的下标。由于已经有序且不重复,必须联想到二分查找。题目已经降低了一些难度,如果是无序数组可考虑使用快速排序等将其排序之后再进行二分查找。如果是重复数组则不能返回唯一的数组下标。本题真正难点是数组边界问题,如何在编程中准确地找到边界,我目前做不到,唯一能寄托希望的是在debug的时候一步步试错,把坑踩完,留下一个正确答案。
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
//这里right相当于指向数组最后+1 的位置
// int mid = right>>1; mid要动态更新,不能写在while循环外
while (left < right) {
//由于right指向数组后一位,即使数组只有一位数据,也可以进入while循环
//只有真正符合实际要求的数组才可以进入while循环
int mid = left +(right - left)/2; //注意动态更新mid
//mid指向中间偏左的位置
//分出三种情况,target等于、大于、小于mid
if(target == nums[mid]){
return mid;
} else if(target > nums[mid]) {
left = mid + 1;
//如果程序执行到这里,那么target一定大于mid指向的数据
//让left指针改为mid后面一位
}else if (target < nums[mid]){
right = mid;
//如果程序执行到这里,那么target一定小于mid指向的数据
//由于right指向右边界后一位,那么直接将mid赋给right不需要加一
}
}
return -1 ;
}
}