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二分查找相关的更多相关文章

  1. leetcode二分查找问题整理

    自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...

  2. leetcode 二分查找

    https://oj.leetcode.com/problems/search-for-a-range/就是一个二分查找,没事练练手 public class Solution { public in ...

  3. Leetcode 二分查找 Search Insert Position

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search Insert Position Total Accepted: 14279 T ...

  4. [leetcode]二分查找总结

    Search for a Range 1.最简单的想法,用最普通的二分查找,找到target,然后向左右扩张,大量的重复的target,就会出现O(n)效率. class Solution { pub ...

  5. leetcode 二分查找 Search in Rotated Sorted ArrayII

    Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...

  6. leetcode 二分查找 Search in Rotated Sorted Array

    Search in Rotated Sorted Array Total Accepted: 28132 Total Submissions: 98526My Submissions Suppose ...

  7. LeetCode 二分查找模板 II

    模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  8. LeetCode 二分查找模板 I

    模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  9. LeetCode 二分查找模板 III

    模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...

随机推荐

  1. 小白年薪26万,为什么Python岗位薪资越来越高?

    人工智能和大数据概念的兴起,带动了Python的快速增长——Python语言逻辑简洁.入门简单.生态丰富,几乎成为几个新兴领域的不二选择.而除了这两个领域,Python还有更多的适用领域:爬虫.web ...

  2. [luogu3155 CQOI2009] 叶子的染色(树形dp)

    传送门 Solution 十分简单的树形dpQwQ,转移关系:父亲染了儿子不用染 只需要确定根就是简单树形dp,而其实根可以随便取一个非叶子节点 可以分情况讨论发现答案并不会改变 Code //By ...

  3. 第四节:Web爬虫之pyquery解析库

    PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...

  4. vue 使用插件

    上传加载 :vue-infinite-loading

  5. 【郑轻邀请赛 F】 Tmk吃汤饭

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2132 [题意] [题解] 很容易想到用队列来模拟; 这个队列维护的是正在煮的4个人煮 ...

  6. [置顶] Git学习总结(1)——Git使用详细教程

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...

  7. BNUOJ 3958 MAX Average Problem

    MAX Average Problem Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Jav ...

  8. BZOJ1192 鬼谷子的钱袋

    没想到这是一道省选题... /* BZOJ1192 */ #include <cstdio> int main() { ; scanf("%d",&m); ;m ...

  9. NEMA-0183(GPRMC GPGGA)详细解释

    NEMA-0183(GPRMC GPGGA)详细解释 nmea数据如下:  $GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5. ...

  10. [bzoj1455]罗马游戏_左偏树_并查集

    罗马游戏 bzoj-1455 题目大意:给你n个人,2种操作,m次操作:1.将i号士兵所在的集合的最小值删除 2.合并i和j两个士兵所在的团体 注释:$1\le n\le 10^6$,$1\le m ...