力扣第35题搜索插入位置

一、题目:35. 搜索插入位置
力扣第35题搜索插入位置_第1张图片

二、题目解析:

  1. 该题目如果使用暴力解决的话需要 O(n) 的时间复杂度,但是如果二分的话则可以降低到 O(logn)

三、实现思路:

  1. 二分查找,先设定左侧下标 left 和右侧下标 right ,再计算中间下标 mid
  2. 每次根据 nums[mid] 和 target 之间的大小进行判断,相等则直接返回下标,target > nums[mid] 则 left 右移,如果nums[mid] > target 则 right 左移,查找结束
  3. 如果没有相等值则返回 left,该值为插入位置
  4. 时间复杂度: O(logn)

四、代码实现:

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(target==nums[mid]){
                return mid;
            }else if(target>nums[mid]){
                left = mid + 1;
            }else{
                right = mid-1;
            }
        }
        return left;
    }

//二分常规模板  避免边界问题
public int searchInsert(int[] nums, int target) {
     int left = 0, right = nums.length - 1; // 注意
     while(left <= right) { // 注意
         int mid = (left + right) / 2; // 注意
         if(nums[mid] == target) { // 注意
             // 相关逻辑
         } else if(target>nums[mid]) {
             left = mid + 1; // 注意
         } else {
             right = mid - 1; // 注意
         }
     }
     // 相关返回值
     return 0;
 }

注意事项:

  1. int mid = left + (right - left)/2的使用是为了避免溢出问题
  2. 举个例子,假如现在数值最多到 10,大于10就会溢出了,现在假设left = 6 right = 8;如果现在两个相加再除,6+8 = 14发生溢出了。但是是6 + (8-6)/2 则是6+1 = 7 则不会溢出

五、测试结果:

力扣第35题搜索插入位置_第2张图片

六、结束

你可能感兴趣的:(leetcode,算法)