
二分查找
蛋卷在月球烤面包
这个作者很懒,什么都没留下…
展开
-
力扣349 两个数组的交集
方法一:哈希表+遍历 public int[] intersection(int[] nums1, int[] nums2) { HashMap<Integer,Boolean> map=new HashMap<>(); List<Integer> res=new ArrayList<>(); for(int i=0;i<nums1.length;i++){ map.pu原创 2022-04-28 17:02:34 · 190 阅读 · 0 评论 -
力扣287 寻找重复数
思路:二分查找的思路是先猜一个数(有效范围 [left..right] 里位于中间的数 mid),然后统计原始数组中 小于等于 mid 的元素的个数 cnt。如果 cnt 严格大于 mid。根据抽屉原理,重复元素就在区间 [left..mid] 里;否则,重复元素就在区间 [mid + 1..right] 里。注意:题目中说长度为n + 1的数组,数值在1到n之间。因此长度为len,数值在1到len - 1之间。left=1是因为没有用数组的下标进行查找,直接比较数字大...原创 2022-03-24 21:05:26 · 439 阅读 · 0 评论 -
力扣209 长度最小的子数组
思路:比如求从第 i 个数字开始,总和大于等于 s 时的长度,我们只需要找从第 i + 1 个数字到第几个数字的和大于等于 s - nums[i] 即可。求 i + 1 到 j 的所有数字的和的话,也就是 sums[j] - sums[i]。至于二分查找,我们只需要修改内层的 for 循环。对于 sums[j] - sums[i] >= s2,通过移项,也就是 sums[j] >= s2 + sums[i] ,含义就是寻找一个 sums[j],使得其刚好大于等于 s2 + sums[i]原创 2022-03-24 18:32:45 · 235 阅读 · 0 评论 -
力扣162 寻找峰值
也许很多人看了,还是不懂,图解也只是迷迷糊糊根据答案来,我这里通俗解释以下,这道题,最最最重要的是条件,条件,条件,两边都是负无穷,数组当中可能有很多波峰,也可能只有一个,如果尝试画图,就跟股票信息一样,没有规律,如果根据中点値判断我们的二分方向该往何处取, 这道题还有只是返回一个波峰。你这样想,中点所在地方,可能是某座山的山峰,山的下坡处,山的上坡处,如果是山峰,最后会二分终止也会找到,关键是我们的二分方向,并不知道山峰在我们左边还是右边,送你两个字你就明白了,爬山(没错,就是带你去爬山),如果你往下..原创 2022-03-24 15:57:54 · 341 阅读 · 0 评论 -
力扣34 在排序数组中查找元素的第一个和最后一个位置
注意:在第二个二分查找中,mid的取值有所不同。因为如果还是int mid=left+(right-left)/2;当while循环运行到最后时,right=left+1,导致mid=left,然后left=mid,如此循环,会一直无法停下,所以mid需要向上取整。public int[] searchRange(int[] nums, int target){ if(nums.length==0) return new int[]{-1,-1}; int left=0原创 2022-03-24 15:32:18 · 528 阅读 · 0 评论 -
力扣4 寻找两个正序数组的中位数
思路:那么如果左半边全小于右半边,如果左边的元素个数相加刚好等于k, 那么第k个元素就是Max(LMax1, LMax2),这个比较好理解的,因为Max(LMax1, LMax2)肯定是左边k个元素的最大值,因为合并后的数组是有序,第k个元素肯定前面k个元素中最大的那个。public double findMedianSortedArrays(int[] nums1, int[] nums2){ if(nums1.length>nums2.length){ ..原创 2022-03-24 12:59:36 · 145 阅读 · 0 评论 -
力扣33 搜索旋转排序数组
思路:将旋转后的数组分成两半,一定有一半是升序的,根据两个端点判断target是否在这一半里,如果不在就是在另一半中。public int search(int[] nums, int target) { int left=0; int right=nums.length-1; while(left<=right){ int mid=left+(right-left)/2; if(nums[mid].原创 2022-03-23 15:46:04 · 314 阅读 · 0 评论 -
力扣300 最长递增子序列
public int lengthOfLIS(int[] nums){ int len=nums.length; if(len<2) return len; int[] dp=new int[len]; //以每个数为终点的最长递增序列长度最小为1 Arrays.fill(dp, 1); for(int i=1;i<len;i++){ for(int j=0;j<i;j.原创 2022-02-25 16:49:00 · 193 阅读 · 0 评论 -
剑指offer4 二维数组中的查找
public boolean findNumberIn2DArray(int[][] matrix, int target){ int i=matrix.length-1; int j=0; while(i>=0&&j<matrix[0].length){ if(matrix[i][j]>target) i--; else if(matrix[i][j]<target) .原创 2022-02-17 15:48:46 · 170 阅读 · 0 评论 -
二分查找算法
力扣704 二分查找public int search(int[] nums, int target) { int left=0; int right=nums.length-1;//左闭右闭区间 while(left<=right){//问题 int mid=(left+right)/2; if(nums[mid]<target) left=mid+1; else i.原创 2022-02-17 14:44:53 · 310 阅读 · 0 评论