给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums = [1,3,5,6], target = 5 输出: 2 示例2: 输入: nums = [1,3,5,6], target = 2 输出: 1 示例 3: 输入: nums = [1,3,5,6], target = 7 输出: 4
解题思路:其实题目已经有明显提示,请必须使用时间复杂度为 O(log n) 的算法。又得适用于数组,那就只有二分查找法最合适了。简单回顾一下二分查找:在有序的数组中(假设升序),将数组下标为中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置的数组下标将数组分成前、后两个子数组,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子数组,否则进一步查找后一子数组。重复以上过程,直到找到满足条件的数组元素,使查找成功,或直到子数组不存在为止,此时查找不成功。然后直接上代码:
ublic class ArrayTest2 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入数组(用逗号隔开):");
String str=input.next();
String[] str1 = str.split(",");
// 改用int数组存储信息,方便下一步操作
int[] num = new int[str1.length];
for (int i = 0; i < str1.length; i++) {
// 将转化为int类型的数字赋值导int类型数组里
num[i] = Integer.parseInt(str1[i]);
}
System.out.println("请输入target值:");
int target=input.nextInt();
int result=searchInsert(num,target);
System.out.println(result);
}
/**
*
* @param nums:传入的数组
* @param target:目标值
* @return:目标值所在(或插入)的下标
*/
public static 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) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
return mid;
}
}
return left;
}
}