二分查找的实际应用
Posted 袁厨的算法小屋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找的实际应用相关的知识,希望对你有一定的参考价值。
35.搜索插入位置
题目描述
输入: [1,3,5,6], 5
输出: 2
输入: [1,3,5,6], 2
输出: 1
输入: [1,3,5,6], 7
输出: 4
输入: [1,3,5,6], 0
输出: 0
暴力解法
做题思路:
题目代码:
class Solution {
public int searchInsert(int[] nums, int target) {
//数组为0的情况
if(nums.length == 0){
return 0;
}
//第一种情况
if(target<=nums[0]){
return 0;
}
//第二种情况
if(target>nums[nums.length-1]){
return nums.length;
}
for(int i = 1;i<nums.length;i++){
//第三种情况
if(nums[i]==target){
return i;
}
//第四种情况
if(target>nums[i-1]&&target<nums[i]){
return i;
}
}
return 0;
}
}
二分查找法
做题思路:
二分查找主要针对有序数组,根本原来相当于双指针,一个指针指示最大值,一个指针指示最小值。下面我们通过一个例子进行说明我们想查找的数字为48上面的这个例子为一个有序数组,红色为low绿色为hig,蓝色为mid。我们首先求出low和hig的中间位置的数和我们想要查找的数进行比较,然后我们知道是高了还是低了。如果中间数大于被查找的数,那么我们就hig指针到mid的前一位。如果小于被查找的数我们就以移动low指针到mid指针的后一位。该例子的中心思想就好比。平常我们让朋友猜价格,当朋友猜错的时候我们会给他提示,是猜高了还是低了,进而一步步的缩小范围。直至猜中
题目代码:
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
//中间值,与target对比
int mid = (left + right) / 2;
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
}
总结
以上就是这个题目的两种做法,肯定还有别的做法,代码也可以进行简写。这是呈现的是最容易让人理清逻辑的代码,希望大家通过这个题目可以理解二分查找,掌握二分查找的使用方法。
C++版本的大家可以看一下这个文章,写的很细致。还有一些其他文章。作者人也很nice。
大家还可以关注我的CSDN:https://blog.csdn.net/tan45du_yuan/每天都会为大家更新一道精选算法题。感谢大家支持。
题目来源:
- END -
以上是关于二分查找的实际应用的主要内容,如果未能解决你的问题,请参考以下文章