搜索插入位置

98 阅读1分钟

搜索插入位置

说明

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素升序 排列数组
  • -104 <= target <= 104

来源:力扣(LeetCode) 链接:leetcode.cn/problems/se…

题解

解法一(暴力破解)

    public static void main(String[] args) {
        int[] nums = new int[]{1,3,5,6};
        int target = 1;
        System.out.println(demo(nums,target));
    }

    public static int demo(int[] nums, int target){
        //输入: nums = [1,3,5,6], target = 5
        //输出: 2
        if(nums.length == 0){
            return 0;
        }
        for (int i = 0; i < nums.length; i++) {
            if(nums[i] >= target){
                return i;
            }
        }
        return nums.length;
    }

解法二(二分查找)

思想就是二分查找

这下面是借鉴力扣中大佬的思路

    public static void main(String[] args) {
        int[] nums = new int[]{1,3,5,6};
        int target = 1;
        System.out.println(demo(nums,target));
    }

    public static int demo(int[] nums, int target){
        if(nums.length == 0){
            return 0;
        }
        int len = nums.length;
        int l = 0, r = len - 1;
        //当最小位大于最大位(或者等于),说明已经找到了target的位置
        while (l < r) {
            //取得中位数
            int m = l + (r - l + 1) / 2;
            if (nums[m] > target) {
                // 1.nums[m] > target必然不符合要求->主动排除向左查找
                r = m - 1;
            } else {
                // 2.否则向右查找(含)
                l = m;
            }
        }
        return target > nums[l] ? l + 1 : l;
    }