<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 ...
随机推荐
- HDU1075 What Are You Talking About(map)
传送门 题目大意:一个单词对应另一个单词 翻译一段文字 题解:stl map走一波 代码: #include<iostream> #include<map> #include& ...
- Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest dp
E. The Contest A team of three programmers is going to play a contest. The contest consists of
- Eviews作时间序列分析的一个实例
时间序列分析是作时间序列数据预测的一个重要部分,由于此次实验室竞赛也用到了时间序列分析,就在此说一下平稳性分析以及非平稳处理的方法: 1.判断平稳性 1.1平稳性的定义 ...
- Oracle讨论Java 13版本
JDK 13提高了应用程序性能,添加了两种语言功能预览,以及更多JDK 13 根据Oracle Java Team的说法,JDK 13致力于通过提高Java SE平台和JDK的性能,稳定性和安全性来 ...
- Selenium+java - 单选框及复选框处理
一.什么是单选框.复选框? 二.被测页面html源代码 CheckBoxRadioDemo.html <!DOCTYPE html> <html lang="en" ...
- 二、Mapper映射文件
Mapper映射文件 mapper.xml映射文件主要是用来编写SQL语句的,以及一些结果集的映射关系的编写,还有就是缓存的一些配置等等. 在映射文件里面可以配置以下标签: 元素名称 描述 备注 se ...
- Long类型数据前端精度丢失
问题描述 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440 相 ...
- Kettle-动态数据链接,使JOB得以复用
动态数据连接,使JOB得以复用 背景 移动执法系统在目前的主要的部署策略为1+N的方式,即总队部署一套,地市各部署一套,且基本都在环保专网.各地市的业务数据需要推送到总队系统,以便总队系统做整体的监督 ...
- .net core使用NLog日志
前言:NLog日志对.net core web项目最新的支持在官网上有最新的介绍: 官网介绍地址:https://github.com/NLog/NLog/wiki/Getting-started-w ...
- iota: Golang 中优雅的常量
阅读约 11 分钟 注:该文作者是 Katrina Owen,原文地址是 iota: Elegant Constants in Golang 有些概念有名字,并且有时候我们关注这些名字,甚至(特别)是 ...