leetcode二分查找相关
33/81搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
思路:
- 设置左右指针开始进入二分循环
- 判断中间的数是否为target,否则通过比较nums[mid] < nums[right]确定是右边有序还是左边有序,从而通过有序的那部分判断target的是否属于该部分,并以此调整左右指针。
注意包含边界与target的比较,如nums[left] <= target
// len = 0情况
if (nums.length == 0) return -1;
// 左右指针
int left = 0, right = nums.length - 1;
// 二分循环
while (right >= left){
int mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < nums[right]){
if (nums[mid] < target && nums[right] >= target) left = mid + 1;
else right = mid - 1;
}
else {
if (nums[left] <= target && nums[mid] > target) right = mid - 1;
else left = mid + 1;
}
// 81 中可以有重复值,就会出现来面两种情况,[3 1 1] 和 [1 1 3 1],中间值等于最右值,3既可以在左边又可以在右边
// 要添加nums[mid] == nums[right]的处理
// else right--;
}
// 出了循环,就是没有找到
return -1;
34在排序数组中查找元素的第一个和最后一个位置
在有重复值,且需要返回重复值中的第一个或最后一个时,用下面的二分搜索
while (lo < hi){
int mid = 1 + lo + (hi - lo) / 2; // 找最后一个时用,+1为了让mid能进一,找第一个不用加
if (nums[mid] > target){ // 找第一个时,这里的逻辑相反
hi = mid - 1;
} else {
lo = mid;
}
}
35搜索插入位置
二分搜索,有就返回index,没有就返回left(二分结束后落在第一个比target大的数的位置上)
74搜索二维矩阵
只是二分搜索的二维版本,最大的不同就是除以列数获取层,对列数取模获取列,即matrix[mid / colsNum][mid % colsNum]
if (matrix.length == 0 || matrix[0].length == 0) return false;
int rowsNum = matrix.length, colsNum = matrix[0].length;
if (matrix[0][0] > target || matrix[rowsNum - 1][colsNum - 1] < target) return false;
int low = 0, high = rowsNum * colsNum - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (matrix[mid / colsNum][mid % colsNum] < target) low = mid + 1;
else if (matrix[mid / colsNum][mid % colsNum] > target) high = mid - 1;
else return true;
}
return false;
300最长上升子序列,354俄罗斯套娃信封问题
354需要w和h都大于才能装下。
输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出: 3
解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。
排序规则,w从小到大,w相等时,h从大到小。原因是,w相等时先让h大的加到list中,从而限制后续再有w相同的信封加入进来扩大list.size(w只有大于才能装下小的)。即便h可能太大了,但后续的信封可以把它替换掉,只要它大于倒数第二个,此时增加信封的门槛又降低了。
List<Integer> list = new ArrayList<>();
// 300省略排序,直接遍历
Arrays.sort(envelopes, (arr1, arr2) -> {
if (arr1[0] != arr2[0]) {
return arr1[0] - arr2[0];
} else {
return arr2[1] - arr1[1];
}
});
for (int[] envelope : envelopes) {
int left = 0, right = list.size() - 1, t = envelope[1];
while (left <= right) {
int mid = left + (right - left) / 2;
if (list.get(mid) < t) left = mid + 1;
else if (list.get(mid) > t) right = mid - 1;
else {
left = mid;
break;
}
}
if (left >= list.size()) list.add(t);
else list.set(left, t);
}
return list.size();
leetcode二分查找相关的更多相关文章
- leetcode二分查找问题整理
自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...
- leetcode 二分查找
https://oj.leetcode.com/problems/search-for-a-range/就是一个二分查找,没事练练手 public class Solution { public in ...
- Leetcode 二分查找 Search Insert Position
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search Insert Position Total Accepted: 14279 T ...
- [leetcode]二分查找总结
Search for a Range 1.最简单的想法,用最普通的二分查找,找到target,然后向左右扩张,大量的重复的target,就会出现O(n)效率. class Solution { pub ...
- leetcode 二分查找 Search in Rotated Sorted ArrayII
Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...
- leetcode 二分查找 Search in Rotated Sorted Array
Search in Rotated Sorted Array Total Accepted: 28132 Total Submissions: 98526My Submissions Suppose ...
- LeetCode 二分查找模板 II
模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- LeetCode 二分查找模板 I
模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- LeetCode 二分查找模板 III
模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...
随机推荐
- SQl基本操作——视图
视图适合频繁查询的表:将一个查询结果作为虚拟表提供给开发人员.安全性高,视图只能查询不能修改,它是一张虚拟表.查询方便,逻辑清晰,但是性能低,一般情况下不如自己写sql语句. --创建视图 creat ...
- 如何在Android Studio中查看一个类的继承关系呢?
在面板顶部的工具栏中,找到Navigate,然后在下拉列表中,找到“Type Hierarchy”(快捷键 Ctrl+H),点击.即可在面板右侧出现该类的Hierarchy层级图.
- C# 获得Properties下的定义的资源
var str1 = Properties.Resources.ResourceManager.GetObject("String1", null); string url = S ...
- Servlet+JSP(三):第一个Web程序
Servlet+JSP(三):第一个Web程序在学习了服务器并成功安装后,我们知道当浏览器发送请求给服务器后,服务器会调用并执行对应的逻辑代码进行请求处理.逻辑代 码是由程序员自己编写然后放进服务器进 ...
- VMware虚拟机下Ubuntu安装VMware Tools详解
一.安装步骤 1.开启虚拟机,运行想要安装VMware Tools的系统,运行进入系统后,点击虚拟机上方菜单栏的“虚拟机(M)”->点击“安装 VMware Tools”,图片所示是因为我已经安 ...
- 【上海站】EOLINKER 用户培训之旅,等你来共建API新连接
从今年3月4日起,EOLINKER AMS 团队将再次开启全国用户培训之旅.本次全国培训之旅依旧将覆盖北上广深等国内主要城市,重点提供两种服务内容,一是 对 EOLINKER 产品的交流,包括 API ...
- 比n大的最小不重复数
void Calculate(int a) { int pa = a; ; ] = {}; //将pa按位存储到数组b ) { b[count++] = pa%; pa = pa/; } bool f ...
- 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)
长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到.例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等. 在这些表示法中,字典序最小 ...
- Nginx反向代理WebSocket(WSS)
1. WebSocket协议 WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法.作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程序的难 ...
- 关于框架搭建-web
最近一直在学习前端相关的东西,在学了一堆基础可以以及动手在某个前端框架上写了一些东西之后,我想尝试着开始自己搭建一个框架.不知道时间需要多久,但会持续更新.小菜鸟的成长记录. ------------ ...