[LeetCode-数组-35]

2019-08-19 470 2

题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。

审题

1、题目给定的是一个有序数组,对于有序数组的查找,首先应该想到二分法查找

2、题目要求,如果在目标值不存在的情况下,需要返回将要被插入的位置

3、题目要求,时间复杂度为O(log n),由此暴力查找的方式是行不通的

解析

二分查找:二分法查找,也称作折半查找或对数查找,是一种在有序数组中查找某一特定元素的搜索算法。其基本原理是通过不断将待查找的区间分成两半,逐步缩小查找范围,直到找到目标元素或确定目标元素不存在。

二分法查找图解

通过Java实现的该结题算法:

public class Solution {  
public 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; // 目标值在左半部分或不存在,缩小搜索范围
}
}

// 如果没有找到目标值,left就是插入位置
return left;
}

public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {1, 3, 5, 6};
int target = 5;
System.out.println(solution.searchInsert(nums, target)); // 输出: 2

target = 2;
System.out.println(solution.searchInsert(nums, target)); // 输出: 1

target = 7;
System.out.println(solution.searchInsert(nums, target)); // 输出: 4

target = 0;
System.out.println(solution.searchInsert(nums, target)); // 输出: 0
}
}

相关文章

评论(2)

发布评论