<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 ...
随机推荐
- 【使用篇二】SpringBoot使用JdbcTemplate操作数据库(12)
Spring对数据库的操作在jdbc上面做了深层次的封装,提供了JdbcTemplate模板. 在SpringBoot使用JdbcTemplate很简单: 引入数据库驱动包(mysql或oracle) ...
- 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)
卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...
- Paper | PyTorch: An Imperative Style, High-Performance Deep Learning Library
目录 0. 摘要 1. 简介 2. 背景 3. 设计原则 4. 针对易用性的核心设计 4.1 让深度学习模块不过是Python程序 4.2 互用性和可拓展性 4.3 自动差分 5. 针对高性能的PyT ...
- 多网卡做team
简明的说,就是把多个物理网卡绑定成一个逻辑上的网卡,以增加带宽,或者实现主备功能,增加硬件冗余,以实现更高的系统稳定性,目前主要有bond和team两种做法,而bond主要是针对双网卡的情况来说,而t ...
- antV G2 为柱状图添加背景颜色
工作中需要在基础柱状图的基础上添加一个自定义高度的背景颜色, 基础柱状图: 目标柱状图: 由于chart绘图可以重叠,通过该特性,我们可以在画两次图重叠在一起,第一次绘图描述背景,第二次绘图描述数据, ...
- Java开发桌面程序学习(二)————fxml布局与控件学习
JavaFx项目 新建完项目,我们的项目有三个文件 Main.java 程序入口类,载入界面并显示 Controller.java 事件处理,与fxml绑定 Sample.fxml 界面 sample ...
- 3DES对称加密算法(ABAP 语言实现版)
公司人事数据要求在系统间加密传输,而对接系统大部分是Java系统,要在不同的异构系统间能很好的加解密码,想到了标准的对称加密算法DES,因为是标准的算法,网络上存在大量公开用Java的DES算法,JA ...
- sql 小全
前些日子sql用到哪里写到哪里,乱七八糟,今天整理了一下,以作备份(虽然开通博客已经八个月了,但是今天还是第一次发表博文,好紧张啊~~) --2014.08.27号整理sql语句 1:进入数据库 us ...
- java基础(15):常用API(Object、String、StringBuffer)
1. Java的API及Object类 在以前的学习过程中,我们都在学习对象基本特征.对象的使用以及对象的关系.接下来我们开始使用对象做事情,那么在使用对象做事情之前,我们要学习一些API中提供的常用 ...
- 致Python初学者的六点建议
Python是最容易学习的编程语言之一,其语法近似英语.通常,初学者只会遇到一些小麻烦,如强制缩进.在函数中使用self等. 然而,当开始阅读.复制和编辑他人代码时,麻烦就接踵而至了. 这里,我将解释 ...