欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

【LeetCode笔记】35. 搜索插入位置(Java、二分法)

发布时间:2024/7/23 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【LeetCode笔记】35. 搜索插入位置(Java、二分法) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 题目描述
  • 思路 & 代码
      • Summary
      • 二刷

题目描述

  • 考虑了一下,还是把这道题作为单独一篇文了。
  • 主要是配合这篇题解一起理解二分法,实践太少理解还不够透彻,还是要温故知新= =

思路 & 代码

  • 先贴代码,结合注释和下面的总结食用~
class Solution {public int searchInsert(int[] nums, int target) {// 插到最后面的情况特殊考虑if(target > nums[nums.length - 1]){return nums.length;}// 二分法:找到第一个 >= target 的值的下标int left = 0, right = nums.length - 1;// 保证结束的时候 left == rightwhile(left < right){// 可读性 & 防止 left + right 溢出int mid = left + (right - left) / 2;// 区间划分成:[left, mid], [mid + 1, right]// 当 mid < target 时,直接舍弃这部分的值(不需要)if(nums[mid] < target){left = mid + 1;}// mid >= target 时,保留 midelse{right = mid;}}return left;} }

Summary

  • int mid = left + (right - left) / 2,可读性 & 防止 left + right 溢出。(位运算好像其实不会变快
  • 区间划分,两种情况:
  • left = mid + 1 && right = mid => [left, mid] && [mid + 1, right],这种情况 mid 要向下取整,防止[left, mid] == [left, right]的情况导致死循环
  • left = mid && right = mid - 1 => [left, mid - 1] && [mid, right],这种情况向上取整,防止
    [mid, right] == [left, right]的情况导致死循环
    • 区间为什么不分成三个部分:结束时不一定有 left == right
    • 出现死循环时,可以输出 left、right、mid来分析
    • 更多内容可见这篇题解

    二刷

    • 很痛苦,上面的 Summary 真的很重要(特别是死循环部分的向上取整、向下取整)
    class Solution {public int searchInsert(int[] nums, int target) {if(target > nums[nums.length - 1]) {return nums.length;}int left = 0, right = nums.length - 1;while(left < right) {int mid = (left + right) / 2;if(nums[mid] < target) {left = mid + 1;}else {right = mid;}}return left;} }

    总结

    以上是生活随笔为你收集整理的【LeetCode笔记】35. 搜索插入位置(Java、二分法)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。