<Binary Search> 81 (高频)34 (很难hard, 高频)315 (hard)354
81. Search in Rotated Sorted Array II
如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的。而如果可以有重复值,就会出现来面两种情况,[3 1 1] 和 [1 1 3 1],对于这两种情况中间值等于最右值时,目标值3既可以在左边又可以在右边,那怎么办么,对于这种情况其实处理非常简单,只要把最右值向左一位即可继续循环,如果还相同则继续移,直到移到不同值为止
class Solution {
public boolean search(int[] nums, int target) {
int n = nums.length, left = 0, right = n - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target) return true;
if(nums[mid] < nums[right]){
if(nums[mid] < target && target <= nums[right]) left = mid + 1;
else right = mid - 1;
}else if(nums[mid] > nums[right]){
if(nums[left] <= target && target < nums[mid]) right = mid - 1;
else left = mid + 1;
}else --right;
}
return false;
}
}
34. Find First and Last Position of Element in Sorted Array(高)
上面的算法不是严格意义上的 O(logn) 的算法,因为在最坏的情况下会变成 O(n),比如当数组里的数全是目标值的话,从中间向两边找边界就会一直遍历完整个数组,那么下面来看一种真正意义上的 O(logn) 的算法,使用两次二分查找法,第一次找到左边界,第二次调用找到右边界即可
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
res[0] = -1;
res[1] = -1;
if(nums == null || nums.length == 0) return res;
res[0] = findFirst(nums, target);
res[1] = findLast(nums,target);
return res;
}
private int findFirst(int[] nums, int target){
int start = 0, end = nums.length - 1;
while(start + 1 < end){
int mid = start + (end - start) / 2;
if(nums[mid] >= target){// 往左边找
end = mid;
}else{
start = mid;
}
}
if(nums[start] == target) return start;
else if(nums[end] == target) return end;
return -1;
}
private int findLast(int[] nums, int target){
int start = 0, end = nums.length - 1;
while(start + 1 < end){
int mid = start + (end - start) / 2;
if(nums[mid] <= target){//往右边找
start = mid;
}else{
end = mid;
}
}
if(nums[end] == target) return end;
else if(nums[start] == target) return start;
return -1;
}
}
354. Russian Doll Envelopes
以width升序, 当width相同时采用降序。
信封的宽度还是从小到大排,但是宽度相等时,我们让高度大的在前面。那么现在问题就简化了成了找高度数字中的LIS,完全就和之前那道Longest Increasing Subsequence一样了
t
class Solution {
public int maxEnvelopes(int[][] envelopes) {
if(envelopes.length < 2) return envelopes.length;
Arrays.sort(envelopes, new EnvelopeComparator());
int[] dp = new int[envelopes.length];
int size = 0;
for(int[] envelope : envelopes){
int left = 0, right = size, mid = 0;
while(left < right){
mid = left + (right - left) / 2;
if(dp[mid] < envelope[1]) left = mid + 1;
else right = mid;
}
dp[left] = envelope[1];
if(left == size) size++;
}
return size;
}
class EnvelopeComparator implements Comparator<int[]>{
public int compare(int[] e1, int[] e2){
return e1[0] == e2[0] ? e2[1] - e1[1] : e1[0] - e2[0];
}
}
}
315. Count of Smaller Numbers After Self
BST: 时间复杂度O(nlongn) ~O(n^2 ),当BST不平衡时时间复杂度O(n ^2)。用merge sort能够稳定在O(nlongn),但较难理解。
把数组从后往前添加到BST中,
1. val == root.val, root.count++,表示这个节点的值相同的个数+1
2. val < root.val,说明这个数值更小,添加到左子树内.
,
class Solution {
class Node{
int val, count, left_count;
Node left, right;
public Node(int val){
this.val = val;
this.count = 1;
}
public int less_or_equal(){
return count + left_count;
}
}
public List<Integer> countSmaller(int[] nums) {
List<Integer> ans = new ArrayList<>();
if(nums.length == 0) return ans;
int n = nums.length;
Node root = new Node(nums[n - 1]);
ans.add(0);
for(int i = n - 2; i >= 0; i--){
ans.add(insert(root, nums[i]));
}
Collections.reverse(ans);
return ans;
}
private int insert(Node root, int val){
if(root.val == val){
++root.count;
return root.left_count;
}else if(val < root.val){
++root.left_count;
if(root.left == null){
root.left = new Node(val);
return 0;
}
return insert(root.left, val);
}else{
if(root.right == null){
root.right = new Node(val);
return root.less_or_equal();
}
return root.less_or_equal() + insert(root.right, val);
}
}
}
<Binary Search> 81 (高频)34 (很难hard, 高频)315 (hard)354的更多相关文章
- [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- Binary Search 的递归与迭代实现及STL中的搜索相关内容
与排序算法不同,搜索算法是比较统一的,常用的搜索除hash外仅有两种,包括不需要排序的线性搜索和需要排序的binary search. 首先介绍一下binary search,其原理很直接,不断地选取 ...
- Validate Binary Search Tree——体现二查搜索树思想的一道题
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- [LeetCode] 255. Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...
- LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>
LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++> 给出排序好的一维有重复元素的数组,随机取一个位置断开 ...
- leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...
- PAT 1064 Complete Binary Search Tree[二叉树][难]
1064 Complete Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a b ...
- 34. Convert Sorted List to Binary Search Tree && Convert Sorted Array to Binary Search Tree
Convert Sorted List to Binary Search Tree OJ: https://oj.leetcode.com/problems/convert-sorted-list-t ...
- [LeetCode] 34. Find First and Last Position of Element in Sorted Array == [LintCode] 61. Search for a Range_Easy tag: Binary Search
Description Given a sorted array of n integers, find the starting and ending position of a given tar ...
随机推荐
- SQL查询--索引
索引概念和作用 索引是建立在表上的可选对象,目的是为了提高查询速度. 如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以 ...
- IDEA debug工具使用
参考:https://www.cnblogs.com/jajian/p/9410844.html
- java之位运算符
整型转二进制:Integer.toBInaryString(6) <<:左移,3<<2 = 3*2*2 = 12 >>:右移,3>>1 = 3/2 = ...
- 搭建Tomcat服务器访问本地资源
目标,搭建Tomcat服务器,使同网络段下其他电脑可以访问分享的文件 下载安装Tomcat 如下图,在官网http://Tomcat.apache.org/下载对应版本的Tomcat,解压安装即可 启 ...
- 【swoole】结合swoole 和 nsq 的实际应用
集合 swoole 的框架设计 为了减少理解度,我尽量的从源头开始引入 1. nsq 案例中是使用 swoole 结合一个php 框架实现的是 NSQ 订阅功能. 启动命令: sudo bash /w ...
- H5混合应用之X5内核
一.X5内核介绍 X5内核是腾讯公司基于优秀开源 webkit 深度优化的浏览器渲染引擎,并且在2014年正式宣布开放给app开发者,所以现在可以在很多app上看到都是使用的X5内核实现Hybrid混 ...
- 网络聊天室---node.js中net网络模块TCP服务端与客户端的使用
//1.简单创建 net服务器 // const net = require("net"); // const server = net.createServer((c)=> ...
- 明解C语言 入门篇 第八章答案
练习8-1 #include<stdio.h> #define diff(x,y)(x-y) int main() { int x; int y; printf("x=" ...
- 从零开始学 ASP.NET Core 与 EntityFramework Core 目录
从零开始学 ASP.NET Core 与 EntityFramework Core 介绍 我是一个目录,它旨在帮助开发者循序渐进的了解 ASP.NET Core 和 Entity Framework ...
- javascript刷新当前页面的几种方式
这里总结一下JavaScript刷新当前页面的几种方式. 1.history对象. history.go(0); 2.location对象. location.reload(); location = ...