我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的 JavaLib」第一时间阅读最新文章,回复【资料】,即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板。
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
必须使用时间复杂度为 O(logn) 的算法。
示例 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 
示例 4:
- 输入: nums = [1,3,5,6], target = 0 
- 输出: 0 
示例 5:
提示:
- 1 <= nums.length <= 10^4^ 
- -10^4^ <= nums[i] <= 10^4^ 
- nums 为无重复元素的升序排列数组 
- -10^4^ <= target <= 10^4^ 
分析
从题目分析有几个关键点,综合分析使用二分查找法最合适。
- 升序排序的数组 
- 元素无重复 
- 数组至少有一个元素,最多 1000 个元素 
- 时间复杂度必须要 O(logn) 
暴力法
抛开算法性能要求,每一种问题都会有暴力的解决方法,也就是我们常人最容易想到的方法,那就是从头到尾遍历数组中的所有元素,直到找到大于或等于待查找值的元素。
 package com.chenpi;
/** * @Description 35. 搜索插入位置 * @Author 陈皮 * @Date 2021/8/30 * @Version 1.0 */public class SearchInsert {
    public int searchInsert(int[] nums, int target) {        // 从头到尾遍历所有元素        for (int i = 0; i < nums.length; i++) {
            if (nums[i] >= target) {                // 找到目标值,或者找到第一个大于目标值的元素,则返回下标                return i;            }        }        // 没有找到目标值,并且目标值都比数组中元素值大,则插入到数组最后        return nums.length;    }
    public static void main(String[] args) {        SearchInsert inst = new SearchInsert();        int[] nums = {1, 3, 5, 6};        System.out.println(inst.searchInsert(nums, 5));    }}
   复制代码
 
二分法
系统要求时间复杂度必须要 O(logn),数组又是有序的,那最合适的就是使用二分查找法。
 package com.chenpi;
/** * @Description 35. 搜索插入位置 * @Author 陈皮 * @Date 2021/8/30 * @Version 1.0 */public class SearchInsert {
    public int searchInsert(int[] nums, int target) {
        int left = 0;        int right = nums.length - 1;
        while (left <= right) {
            // 找出中间位置,使用此方法可以防止溢出,等同(left + right)/2            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {                // 目标值在左区间                right = middle - 1;            } else if (nums[middle] < target) {                // 目标值在右区间                left = middle + 1;            } else {                // 找到目标值                return middle;            }        }        return right + 1;    }
    public static void main(String[] args) {        SearchInsert inst = new SearchInsert();        int[] nums = {1, 3, 5, 6};        System.out.println(inst.searchInsert(nums, 5));    }}
   复制代码
 
本次分享到此结束啦~~
如果觉得文章对你有帮助,点赞、收藏、关注、评论,您的支持就是我创作最大的动力!
评论