算法跟学Day1【代码随想录】

文章详细介绍了二分查找算法在不同场景下的应用,包括寻找目标元素的位置、查找第一个大于或小于目标的元素、搜索插入位置以及移除元素等。通过LeetCode的几个题目展示了二分查找在解决数组问题上的效率和实用性。
摘要由CSDN通过智能技术生成

数组

二分查找理论

  • 前置知识 区间查找的两种写法
  • 写法1 左闭右毕 用在求x是否在区间中
left = 0
right = n - 1
while left <= right:
    if nums[mid] > x:
        right = mid - 1
    else if nums[mid] > x:
        left = mid + 1
    else:
        return mid
return -1
  • 写法2 左闭右开``用在找第一个大于或小于x的下标
left = 0
right = n
while left < right:
    if nums[mid] > x:
        right = mid
    else if: nums[mid] > x:
        left = mid + 1
    else return mid
return -1

LeetCode 704二分查找

  class Solution {
      public int search(int[] nums, int target) {
          // 左闭右毕版本
          int l = 0, r = nums.length - 1;
          while (l <= r) {
              int mid = l + r >> 1;
              if (nums[mid] > target) r = mid - 1;
              else if (nums[mid] < target) l = mid + 1;
              else return mid;
          }
          return -1;
      }
  }
   class Solution {
       public int search(int[] nums, int target) {
           // 左闭右开版本
           int l = 0, r = nums.length;
           while (l < r) {
               int mid = l + r >> 1;
               if (nums[mid] > target) r = mid;
               else if (nums[mid] < target) l = mid + 1;
               else return mid;
           }
           return -1;
       }
   }

LeetCode 35搜索插入位置

  class Solution {
      public int searchInsert(int[] nums, int target) {
          int l = 0, r = nums.length;
          while (l < r) {
              int mid = l + r >> 1;
              if (nums[mid] < target) l = mid + 1;
              else if (nums[mid] > target) r = mid;
              else return mid;
          }
          return l;
      }
  }

LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

 class Solution {
      public int[] searchRange(int[] nums, int target) {
          int l = binarySearch(nums, target);
          int r = binarySearch(nums, target + 1);
          if (l ==  nums.length || nums[l] != target)
              return new int[] {-1, -1};
          return new int[] {l, r-1};
      }
  
      public int binarySearch(int[] nums, int target) {
          int l = 0, r = nums.length;
          while (l < r) {
              int mid = l + r >> 1;
              if (nums[mid] < target) l = mid + 1;
              else if (nums[mid] >= target) r = mid;
          }
          return l;
      }
  }

LeetCode 27 移除元素

   class Solution {
      public int removeElement(int[] nums, int val) {
           int j = 0;
           for (int i = 0; i < nums.length; i++) {
               if (nums[i] != val)
                   nums[j++] = nums[i];
           }
           return j;
       }
   }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值