![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
二分
s
WKP9418
愿有一天开怀大笑
展开
-
162.寻找峰值
开始觉得无从下手,怎么能用二分解决呢?? 写了好多if判断过了。 后来想明白了 这个题就是用二分逼近其中一个最高点。 即用二分找到一个山峰即可。 在山上无非两种情况 上坡:那我们一直向上走。即left=mid+1(不必担心悬崖,悬崖正好也是解) 下坡:那我们反向走,去走上坡,即right=mid 这样会逼近一个山峰。 class Solution { public int findPeakElement(int[] nums) { if(nums.length==1) ret.原创 2020-07-17 18:58:23 · 116 阅读 · 0 评论 -
153和154.寻找旋转排序数组中的最小值
先找到有序的那一部分,然后有序那一部分中最左元素和min作比较。修改范围,再次查找。 class Solution { public int findMin(int[] nums) { int left=0; int min=nums[0]; int right=nums.length-1; while (left<=right){ int mid=left+((right-left)>>1).原创 2020-07-15 14:38:33 · 112 阅读 · 0 评论 -
34.在排序数组中查找元素的起始和末尾位置
输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 找不到输出[-1,-1] 先找到第一个nums[mid]=target的mid,然后分别查找左右。 当时觉得还不错,一运行时间和线性查找差不多。 class Solution { public int[] searchRange(int[] nums, int target) { int left=0; int right=nums.length-1; in原创 2020-07-05 14:29:27 · 349 阅读 · 0 评论 -
33.搜索旋转排序数组
就只想到了O(n)的, 想到的二分, target<nums[left] 则在右边有序搜索 target>=nums[left],在左边有序搜素 自然是错误的,于是搁置不得了之。 看了题解恍然大悟。 以mid分成左右两个数组。 其中至少一个是有序的,且范围已知 如果target在此范围内,二分即可 不在此范围内,搜索另一个数组 class Solution { public int search(int[] nums, int target) { return .原创 2020-07-04 17:46:26 · 133 阅读 · 0 评论 -
475.供暖器
暴力 遍历每一个house位置,找到离最近的heater的距离,最终取距离最大。 class Solution { public int findRadius(int[] houses, int[] heaters) { int ans=-1; for(int house:houses){ ans=Math.max(ans,findMinDest(house,heaters)); } return ans; .原创 2020-06-26 17:12:38 · 199 阅读 · 1 评论 -
稀疏数组搜索
就知道个简单的二分算法,这次看题解发现了新的大陆。 原来二分还能这么玩啊。 class Solution { public int findString(String[] words, String s) { int left=0; int right=words.length-1; int temp=0; while(left<=right){ while(left<=right&&.原创 2020-06-24 17:13:54 · 170 阅读 · 0 评论 -
1351.统计有序矩阵中的负数
每行二分 class Solution { public int countNegatives(int[][] grid) { int row=grid.length; int col=grid[0].length; int cot=0; for(int i=0;i<row;i++){ if(grid[i][col-1]>=0) continue; if(grid[i][0].原创 2020-06-23 11:29:27 · 330 阅读 · 0 评论 -
349.两个数组的交集
做法基本两种 一是用java的set来做 二是用排序+二分/双指针来做 实现2 排好序了,可以比较下两个数组的最大值,最小值,看看是否有解,在大量数据的时候可以剪枝。 int max1,max2,min1,min2; if(nums1.length==0||nums2.length==0) return new int[0]; max1=nums1[nums1.length-1];//看到长度-1,考虑是否越界 min1=nums1[0]; max.原创 2020-06-21 15:54:05 · 213 阅读 · 0 评论 -
167.两数之和Ⅱ-输入有序数组
双指针+了一点小小小的优化: class Solution { public int[] twoSum(int[] numbers, int target) { int left=0; int right=numbers.length-1; while(left<=right){ int mediate=left+(right-left)/2; if(numbers[left]+numbers[ri原创 2020-06-18 21:17:35 · 137 阅读 · 0 评论