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的更多相关文章

  1. [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 ...

  2. Binary Search 的递归与迭代实现及STL中的搜索相关内容

    与排序算法不同,搜索算法是比较统一的,常用的搜索除hash外仅有两种,包括不需要排序的线性搜索和需要排序的binary search. 首先介绍一下binary search,其原理很直接,不断地选取 ...

  3. Validate Binary Search Tree——体现二查搜索树思想的一道题

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  4. [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 ...

  5. LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>

    LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++> 给出排序好的一维有重复元素的数组,随机取一个位置断开 ...

  6. 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 ...

  7. PAT 1064 Complete Binary Search Tree[二叉树][难]

    1064 Complete Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a b ...

  8. 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 ...

  9. [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 ...

随机推荐

  1. Intellj IDEA 快捷键冲突

    Intellij IDEA快捷键冲突 [问题描述]: ctr + alt + 方向键 与系统的快捷键冲突,按快捷键,屏幕方向发生改变. [解决办法]: ctr + alt + F12 调用出Intel ...

  2. PHP 多进程和多线程的优缺点

    PHP 多进程和多线程的优缺点 多进程 1.使用多进程, 子进程结束以后, 内核会负责回收资源 2.使用多进程, 子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程. 3.一个常 ...

  3. Protractor - 怎样运行

    前一篇设置好了Protractor基本运行环境,那怎样运行Protractor呢? 要运行我们的测试脚本,至少需要配置好两个文件: ---Package.json ---conf.js Package ...

  4. mosquitto配置文件

    #配置文件为mosquitto #参见mosquitto.conf(5)了解更多信息. #显示默认值,取消注释以更改. #使用#字符来表示注释,但只有当它是 #第一个字符就行了. #========= ...

  5. Elastic:如何在一个机器上同时模拟多个node

    Elastic:如何在一个机器上同时模拟多个node /bin/elasticsearch -E node.name=node1 -E cluster.name=my-application -E p ...

  6. Python【day 14-5】sorted filter map函数应用和练习

    '''''' ''' 内置函数或者和匿名函数结合输出 4,用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=[‘oldboy’,'alex','wusir'] 5,用m ...

  7. Python【day 13】内置函数02

    一.作用域相关-2个 1.locals() 参数是空 返回当前位置作用域的所有变量,返回的是字典 当前位置:函数内,返回局部变量 当前位置:函数外,返回全局变量 2.globals() 参数是空 返回 ...

  8. 解决pip使用异常No module named 'pip'

    场景 在使用pip进行升级时 python install --upgrade named pip 时提示: No module named pip 注: 博客: https://blog.csdn. ...

  9. AppBoxFuture(八): 另类的ORM实现

      通常的ORM实现基于配置或注释,由反射或Emit生成相应的Sql语句,然后将Sql发送给数据库解析Sql字符串生成AST再交给优化器处理后执行,返回的数据再经由反射或Emit转换为相应的实体实例. ...

  10. 9.智能快递柜SDK(串口型锁板)

    1.智能快递柜(开篇) 2.智能快递柜(终端篇) 3.智能快递柜(通信篇-HTTP) 4.智能快递柜(通信篇-SOCKET) 5.智能快递柜(通信篇-Server程序) 6.智能快递柜(平台篇) 7. ...