提示:本题来自leetcode35题
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
提示:以下是本篇文章正文内容,下面案例可供参考
一、二分查找法?
解释:又称为 折半查找,二分查找,适合对已经排序好的数据集合进行查找,时间复杂度O(log2n),效率高。假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,,如果等于key则返回,如果大于关键字key,则在前一个数据集合中查找,否则在后一个子集中查找,直到找到为止,如果没找到则返回-1;
二、本题解法
1.暴力解法
代码如下(示例):
public class Solution4 {
//暴力解法
public static int yesNoNumber(int number, int[] nums){
int a = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= number){
return i;
}
if (nums[i] < number){
a+=1;
}
}
return a;
}
public static void main(String[] args) {
int i = yesNoNumber(7, new int[]{1, 3, 5, 6});
System.out.println(i);
}
}
2.二分查找法
代码如下(示例):
public class Solution4 {
//二分法
public static int yesNoNumber(int number, int[] nums){
int length = nums.length;
int left = 0,right = length-1, ans = length;
//当左边值大于右边值跳出循环
while (left <= right){
int min = (left + right)/2;
//如果数组值大于目标值 应该从中间值向左一位做为右值 左值不变
if (nums[min] >= number){
ans = min;
right = min - 1;
}else {
//如果数组值小于目标值 应从中间值向右一位做为左值 右值不变
left = min + 1;
}
}
return ans;
}
public static void main(String[] args) {
int i = yesNoNumber(7, new int[]{1, 3, 5, 6});
System.out.println(i);
}
}