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. golang--海量用户即使通讯系统

    功能需求: 用户注册 用户登录 显示在线用户列表 群聊 点对点聊天 离线留言

  2. models.py相关API

    models.py import datetime from django.db import models from django.utils import timezone class Quest ...

  3. WEB引入Google思源黑体

    通过Link标签在网页头部引用Google Web Font: 1 <link rel="stylesheet" href="https://fonts.googl ...

  4. C++入门到理解阶段二基础篇(6)——C++数组

    概述 C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 numbe ...

  5. 数据库——SQL-SERVER CREATE-TABLES

    给出数据库实验所需要的“CREATE-TABLES.SQL”文件 use master go if exists (select * from dbo.sysdatabases where name ...

  6. java war包 路径--解决war包中文件路径问题

    https://blog.csdn.net/u013409283/article/details/51480948 转自:http://free-chenwei.iteye.com/blog/1507 ...

  7. oracle学习笔记(十七) PL/SQL高级应用

    PL/SQL高级应用 动态SQL 在PL/SQL中,不能直接执行DDL(create,alter,drop),得使用动态SQL,当然,除了DDL,动态SQL也可以执行DML(select,insert ...

  8. 微信小程序踩坑日记4——真机端解析json数组和开发平台不一样

    0. 引言 环境:访问服务器端php,获取json数组,并渲染在前台 问题描述:保证在开发平台上的正常运行,但是在真机端却出现了无法正确解析wx.request()返回的数据(特指无法解析res.da ...

  9. docker系列(四):数据卷

    1 引言 容器就相当于一个简易的操作系统,我们在上面部署我们的环境,不可避免地产生一些数据,但是,可能由于断电等等原因,容器退出了,那么之前容器中的数据就不符存在,则往往不是我们想要的,更多的,我们是 ...

  10. Oracle第二话之调优工具

    Oracle第二话之调优工具 原创if 0 = -I can 发布于2019-04-09 19:53:12 阅读数 172  收藏 展开 目录 1.告警日志 2.用户进程trace文件 3.动态性能视 ...