算法学习笔记3 寻找数组的中心索引

https://leetcode.cn/leetbook/read/array-and-string/yf47s/ (篇幅有限,引用一下leetcode~)


题解思路:本题这种情况,可以使用二分查找法


一个问题待查找的是整数,并且范围已知的情况下


解释一下二分法

1 首先我们先定义一些需要用到的变量:

数组nums[]:有序排列(前提条件)

left:代表数组左侧元素的下标和最终返回的将target插入的下标,初始值为0(第一个元素)

right:代表数组右侧元素的下标,初始值为数组长度-1(最后一个元素)

sum:代表在数组中的中间元素


int mid = left + (right - left) / 2;


,请见图示:以数组[ 1, 3, 5, 6, 8, 2, 10 ],想找出target元素为2的数组索引为例:


遍历次数 target mid nums[mid] left right
1 2 3 6 0 6



于是:2<6(target<nums[mid]) ,因此right = mid-1=2, 此时mid的下标为:(0+2-0)/2=1,再次遍历:


遍历次数 target mid nums[mid] left right
2 2 1 3 0 2

此时第二次遍历的图示:

于是:2<3(target<nums[mid]) ,因此right = mid-1=0, 此时mid的下标为:0,再次遍历:


遍历次数 target mid nums[mid] left right
3 2 0 1 0 1

于是:2>1(target>nums[mid]) ,因此可以确定可插入的位置是left+1=0+1=1


最终的题解代码:


private int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length-1;

while (left <= right) {
int mid = (left + (right - left)) / 2;

if (nums[mid] == target) {
return mid; // 目标值已经在数组中,返回索引
} else if (nums[mid] < target) {
left = mid + 1; // 目标值在右半部分
} else {
right = mid - 1; // 目标值在左半部分
}
}
return left; // 目标值不存在于数组中,返回插入位置
}


🤔关于最后返回值,我迷糊了很久,于是乎问了gpt...(太蠢了,莫笑哈😂)


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友9113
下载 APP