LeetCode---Sort && Segment Tree && Greedy
307. Range Sum Query - Mutable
思路:利用线段树,注意数据结构的设计以及建树过程利用线段树,注意数据结构的设计以及建树过程
public class NumArray {
class segmentNode{
int start;
int end;
segmentNode left;
segmentNode right;
int sum;
public segmentNode(int start,int end){
this.start = start;
this.end = end;
this.left = null;
this.right = null;
this.sum = 0;
}
}
segmentNode root = null;
public NumArray(int[] nums) {
root = buildTree(nums,0,nums.length - 1);
}
public segmentNode buildTree(int[] nums,int start,int end){
if(start > end) return null;
else{
segmentNode node = new segmentNode(start,end);
if(start == end) node.sum = nums[start];
else{
int middle = start + (end - start) / 2;
node.left = buildTree(nums,start,middle);
node.right = buildTree(nums,middle + 1,end);
node.sum = node.left.sum + node.right.sum;
}
return node;
}
}
void update(int i, int val) {
update(i,root,val);
}
public void update(int i,segmentNode root,int val){
if(i == root.start && i == root.end) root.sum = val;
else{
int middle = root.start + (root.end - root.start) / 2;
if(i <= middle){
update(i,root.left,val);
}
else{
update(i,root.right,val);
}
root.sum = root.left.sum + root.right.sum;
}
}
public int sumRange(int i, int j) {
return sumRange(i,j,root);
}
public int sumRange(int i,int j,segmentNode root){
if(i == root.start && j == root.end) return root.sum;
else{
int middle = root.start + (root.end - root.start) / 2;
if(i > middle) return sumRange(i,j,root.right);
else if(j <= middle) return sumRange(i,j,root.left);
else return sumRange(i,middle,root.left) + sumRange(middle + 1,j,root.right);
}
}
}
376. Wiggle Subsequence
思路:首先跳过前面所有相等的元素,然后确定第一个是升序还是降序,接着利用贪心算法若降序取最小,若升序取最大,统计个数
public int wiggleMaxLength(int[] nums) {
if(nums.length <= 1) return nums.length;
int num = nums[0];
int k = 1;
while(k < nums.length){
if(nums[k] == num) k++;
else break;
}
if(k == nums.length) return 1;
int res = 2;
//继续用k是因为要跳过之前相等的元素
boolean flag = (nums[k] > nums[k - 1]);
//k++;
while(++k < nums.length){
if(flag && nums[k] < nums[k - 1]){
flag = false;
res++;
}
else if(!flag && nums[k] > nums[k - 1]){
flag = true;
res++;
}
//k++;
}
return res;
}
**406. Queue Reconstruction by Height
思路:按第一元素从大到小排,第二元素从小到大排,进行插入,第二元素实际上就是 插入的索引位置
public int[][] reconstructQueue(int[][] people) {
if(people.length == 0) return new int[0][0];
Arrays.sort(people,new Comparator<int[]>(){
@Override
public int compare(int[] a,int[] b){
if(a[0] == b[0]){
return a[1] - b[1];
}
return b[0] - a[0];
}
});
List<int[]> temp = new ArrayList<int[]>();
for(int i = 0; i < people.length; i++){
int[] ans = people[i];
temp.add(ans[1],new int[]{ans[0],ans[1]});
}
int[][] res = new int[people.length][people[0].length];
int i = 0;
for(int[] k : temp){
res[i][0] = k[0];
res[i][1] = k[1];
i++;
}
return res;
}
**330. Patching Array
思路:用sum标记可达区间的右区间,若元素大于sum则补一个sum,否则扩大可达区间
public int minPatches(int[] nums, int n) {
//sum标记可达区间的右区间,开区间
long sum = 1;//为了防止最后越界将sum设置为long
int i = 0;
int count = 0;
while(sum <= n){
if(i < nums.length && sum >= nums[i]){
sum += nums[i];
i++;
}
else{
//表示1---sum - 1都可达,所以要补个sum
sum += sum;
count++;
}
}
return count;
}
总结
164. Maximum Gap:排序以后进行比较找到最大间隔
56. Merge Intervals:同57
455. Assign Cookies:两个数组排序以后进行遍历,前面判断过的不再考虑,因为绝对不会符合条件
训练
179. Largest Number:通过string排序,让a + b和b + a进行比较,谁大排在前面,注意string之间的比较用compareTo,不能直接-,另外注意特殊情况(开头为0)
**57. Insert Interval:将new Interval加入list一起根据start从小到大排序,通过判断start与end的关系进行合并,注意可以直接利用Collections.sort()
452. Minimum Number of Arrows to Burst Balloons:根据start排序,若有交集则记录最小end,若没有则计数加一
134. Gas Station:根据代数关系得知必须油的总量大于路程耗油量才行,因此只需要找到能到数组末尾站的站点即可
**435. Non-overlapping Intervals:根据end从小到大排序,然后统计留下interval的数量,再用总数去减
135. Candy:先给每个孩子发一个糖,利用Arrays.fill(),然后两趟循环分别判断左右两边的关系
提示
数组排序用Arrays.sort(),抽象数据结构排序用Collections.sort()
优先队列排序直接在声明的时候就能定义排序方式,但注意优先队列的排序方式是堆排序
LeetCode---Sort && Segment Tree && Greedy的更多相关文章
- Leetcode: Range Sum Query - Mutable && Summary: Segment Tree
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- 线段树(Segment Tree)(转)
原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...
- HDU 1542/POJ 1151 Atlantis (scaning line + segment tree)
A template of discretization + scaning line + segment tree. It's easy to understand, but a little di ...
- leetcode 199 :Binary Tree Right Side View
// 我的代码 package Leetcode; /** * 199. Binary Tree Right Side View * address: https://leetcode.com/pro ...
- BestCoder#16 A-Revenge of Segment Tree
Revenge of Segment Tree Problem Description In computer science, a segment tree is a tree data struc ...
- [LintCode] Segment Tree Build II 建立线段树之二
The structure of Segment Tree is a binary tree which each node has two attributes startand end denot ...
- [LintCode] Segment Tree Build 建立线段树
The structure of Segment Tree is a binary tree which each node has two attributes start and end deno ...
- Leetcode 101 Symmetric Tree 二叉树
判断一棵树是否自对称 可以回忆我们做过的Leetcode 100 Same Tree 二叉树和Leetcode 226 Invert Binary Tree 二叉树 先可以将左子树进行Invert B ...
- LeetCode:Construct Binary Tree from Inorder and Postorder Traversal,Construct Binary Tree from Preorder and Inorder Traversal
LeetCode:Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder trav ...
随机推荐
- PHP之配置
1) 错误日志 一.相关配置 需要将php.ini中的配置指令做如下修改: . error_reporting = E_ALL ;将会向PHP报告发生的每个错误 . display_errors = ...
- jQuery-menu-aim 电商菜单栏demo
最近要修改一个电商网站的菜单,引用了jQuery-menu-aim的插件,因此,去找了几个资料: 参考GitHub地址: https://github.com/kamens/jQuery-menu-a ...
- Java高并发程序设计学习笔记(三):Java内存模型和线程安全
转自:https://blog.csdn.net/dataiyangu/article/details/86412704 原子性有序性可见性– 编译器优化– 硬件优化(如写吸收,批操作)Java虚拟机 ...
- [Scrapy-6] XPath使用的一个坑
先上代码: import scrapy from scrapy.selector import Selector class QuoteSpider(scrapy.Spider): name = &q ...
- 利用 Monitor.TryEnter 来规避 .NET 线程死锁的源代码
在开发多线程的应用程序时,我们会大量用到 lock (...) {} 块.如果 lock 的对象比较多,非常容易发生死锁.死锁的发生很难预料,而且一旦发生在界面线程上,界面就不再刷新响和应用户输入:如 ...
- SQL 多表查询展示
########################多表########################SELECT COUNT(*) FROM MEMBER1 A; 查询出来的结果为43行数据: SEL ...
- mysql数据库:数据类型、存储引擎、约束、
1.详细的建表语句 ***** create table 表名( 字段名 数据类型[(长度) 约束条件] ); []代表可选的 为什么需要给数据分类? 189 一 ...
- java-web服务器-tomcat
HTTP服务器: 一.定义: 1)是一个安装在服务端的[资源文件调度软件] 二.作用: 1)自动解析接收的[请求协议包]内容 2)自动在服务端计算机上定位[被访问的文件] 3)自动创建[Http响应协 ...
- 【安徽集训】fiend
考试的时候只会 \(O(Tn^3)\) 的做法,其它题还都不会,想到一整场就打这么点是人都能写的暴力没啥意思,就懒得写了.. Description 双人博弈.每一轮 A 和 B 同时选择一个 \(1 ...
- 方正科技win7重装系统
1.制作装机版U盘启动盘 老毛桃装机版制作启动U盘教程 http://www.laomaotao.org/jiaocheng/92/upqdzz.html 2.下载系统镜像文件保存至U盘启动盘 MSD ...