算法求生 每日刷题记录(三)

算法求生 每日刷题记录(三)

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

请必须使用时间复杂度为 O(log n) 的算法。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-insert-position
示例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
2.解题思路

​ 首先可以了解一下二分查找的思路

二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。每次都通过跟区间的中间元素对比,将查找的区间缩小为之前的一半,直到找到要查找的元素

栗子1:nums = [1,3,5,6], target = 5
第一次 取出中间元素 3 --->  3 < 5 所以 3之前的元素就没必要查找了  --->    [5,6]
第二次 取出中间元素 5 --->  5 = 5 找到了

栗子2:nums = [1,3,5,6], target = 2
第一次 取出中间元素 5 --->  5 > 2 所以 5之后的元素就没必要查找了  --->    [1,3]
第二次 取出中间元素 1 --->  1 < 2 所以 1之前的元素就没必要查找了  ---> [3]
第三次 取出中间元素 3 ---> 3 > 2 没找到 因为 3 > 2 所以位置是 3的位置 - 1

栗子3:nums = [1,3,5,6], target = 7
第一次 取出中间元素 3 --->  3 < 7 所以 3之前的元素就没必要查找了  --->    [5,6]
第二次 取出中间元素 5 --->  5 < 7 所以 5之前的元素就没必要查找了  ---> [6]
第三次 取出中间元素 6 ---> 6 < 7 没找到 因为 7 > 6 所以位置是 6的位置

3.代码实现
public int searchInsert(int[] nums, int target) {
        int left = 0,right = nums.length-1;
        int c = 0;
        while (left <= right){
           c = (left+right)/2;
            if(target > nums[c]){
                left = c+1;
            }else if (target < nums[c]) {
                right = c-1;
            }else {
                return  c;
            }
        }
        if(nums[c] > target){ //c的位置就是最终target要放入的位置 有序
            return c;
        }else{
            return  c+1;
        }

    }
4.运行结果

在这里插入图片描述

posted @ 2022-08-11 09:02  剑心空明  阅读(0)  评论(0编辑  收藏  举报  来源