package y2019.Algorithm.array.medium;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.array.medium
* @ClassName: Trap
* @Author: xiaof
* @Description: TODO 42. Trapping Rain Water
* Given n non-negative integers representing an elevation map where the width of each bar is 1,
* compute how much water it is able to trap after raining.
* *
* * * * *
* * * * * * * * * *
* 0 1 2 3 4 5 6 7 8 9 0 1
* * *
* Input: [0,1,0,2,1,0,1,3,2,1,2,1]
* Output: 6
*
* @Date: 2019/7/25 8:50
* @Version: 1.0
*/
public class Trap { public int solution(int[] height) {
//求出每个位置左边最大和右边最大的差值
int leftMax = 0, rightMax = 0, left = 0, right = height.length - 1, res = 0;
while(left < right) {
//当左边小于右边的时候
if(height[left] < height[right]) { //这里就是说明左边的高度比右边的小,永远能找到一个靠右的墙容纳水
//当左边位置小于右边位置,那么就获取当前位置能容纳多少水
leftMax = Math.max(leftMax, height[left]); //取出当前的左边最大值
//只要知道了左边的最大值,那么就计算差值
res += leftMax - height[left];
++left; } else {
//这里就是标识右边的高度比左边小,那么就可以计算右边容纳的水
//左边不用考虑,肯定有比这个大的,右边只需要考虑更右边的最大值即可
rightMax = Math.max(height[right], rightMax);
res += rightMax - height[right];
--right;
}
} return res;
} public int solution1(int[] height) {
//从第一个位置开始每个阶段位置宽度都是1,然后当遇到第一个不相等的高度的时候,就可以计算单位
//两高夹一矮就是容水量
int res = 0, mx = 0, n = height.length;
int[] dp = new int[n];
//第一遍取每一步的当前最大值
for (int i = 0; i < n; ++i) {
dp[i] = mx;
mx = Math.max(mx, height[i]);
}
mx = 0;
//第二遍遍历,每次取右边的每一步最小值,
for (int i = n - 1; i >= 0; --i) {
dp[i] = Math.min(dp[i], mx); // 去最大值的之间的小值
//取当前位置的右边最大值
mx = Math.max(mx, height[i]);
//相减值大于0,计算结果差值
if (dp[i] - height[i] > 0) res += dp[i] - height[i];
}
return res; } }
package y2019.Algorithm.array.medium;

import java.util.HashMap;
import java.util.Map; /**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.array.medium
* @ClassName: LongestConsecutive
* @Author: xiaof
* @Description: TODO 128. Longest Consecutive Sequence
* Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
* Your algorithm should run in O(n) complexity.
*
* Input: [100, 4, 200, 1, 3, 2]
* Output: 4
* Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.
*
* 给定一个未排序的整数数组,找出最长连续序列的长度。
* 要求算法的时间复杂度为 O(n)。
*
* @Date: 2019/7/25 9:56
* @Version: 1.0
*/
public class LongestConsecutive { public int solution(int[] nums) {
//未排序的数组,求最长连续的序列
//用map存放进入当前值,第二个参数是序列长度,当前值的n-left就是这个序列的开始的位置的值,当前值n+right是这个序列结束的位置
int res = 0;
Map<Integer, Integer> map = new HashMap<>(); for(int n : nums) {
//遍历所有数据
if(!map.containsKey(n)) {
//判断map是否包含左边的数据,和右边的数据
int leftSeqLen = map.containsKey(n - 1) ? map.get(n - 1) : 0; //判断是否包含n-1,如果不包含,那就是0
int rightSeqLen = map.containsKey(n + 1) ? map.get(n + 1) : 0; int sum = leftSeqLen + rightSeqLen + 1; //吧两边连起来
//放进去数据
map.put(n, sum); res = Math.max(res, sum); //扩展长度为对应的值,按理说中间的数据也应该更新数据,但是这里重复的数据也不会继续执行
//那么只需要更新两端的数据即可
map.put(n - leftSeqLen, sum);
map.put(n + rightSeqLen, sum); } else {
//如果已经存在这个数了
continue;
}
} return res;
} public static void main(String[] args) {
int data[] = { 100, 4, 200, 1, 3, 2};
LongestConsecutive fuc = new LongestConsecutive();
fuc.solution(data);
System.out.println();
} }

【LEETCODE】62、数组分类,hard级别,题目:42、128的更多相关文章

  1. [LeetCode] All questions numbers conclusion 所有题目题号

    Note: 后面数字n表明刷的第n + 1遍, 如果题目有**, 表明有待总结 Conclusion questions: [LeetCode] questions conclustion_BFS, ...

  2. LeetCode:颜色分类【75】

    LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...

  3. LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)

    这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961).在大小为2N的数组A中,存在N+1个唯一元素,并且这些元 ...

  4. LeetCode:数组中的第K个最大元素【215】

    LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...

  5. LeetCode: 62. Unique Paths(Medium)

    1. 原题链接 https://leetcode.com/problems/unique-paths/description/ 2. 题目要求 给定一个m*n的棋盘,从左上角的格子开始移动,每次只能向 ...

  6. LeetCode一维数组的动态和

    一维数组的动态和 题目描述 给你一个数组 nums.数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]...nums[i]). 请返回 nums 的动态和. 示例 1: ...

  7. 【LEETCODE】56、数组分类,适中级别,题目:62、63、1035

    package y2019.Algorithm.array.medium; /** * @ClassName UniquePathsWithObstacles * @Description TODO ...

  8. 【LEETCODE】53、数组分类,简单级别,题目:989、674、1018、724、840、747

    真的感觉有点难... 这还是简单级别... 我也是醉了 package y2019.Algorithm.array; import java.math.BigDecimal; import java. ...

  9. 【LEETCODE】61、对leetcode的想法&数组分类,适中级别,题目:162、73

    这几天一直再想这样刷题真的有必要么,这种单纯的刷题刷得到尽头么??? 这种出题的的题目是无限的随便百度,要多少题有多少题,那么我这一直刷的意义在哪里??? 最近一直苦苦思考,不明所以,刷题刷得更多的感 ...

随机推荐

  1. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  2. fork和vfork

    转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题——为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不 ...

  3. 第10组 团队Git现场编程实战

    组员职责分工 姓名 分工 童景霖 博客 朱晓倩 制作UI 万本琳 制作UI 唐怡 制作UI 陈心怡 制作UI 黄永福 测评福州最受欢迎的商圈.后期代码修改和完善 郑志强 测评各个价位的前五美食餐厅代码 ...

  4. Jedis与Jedis连接池

    1.Jedis简介 实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis, 对于主流语言,Redis都提供了对应的客户端: https://redis.io/clients 2. ...

  5. elasticsearch-py 解决 too_long_frame_exception 问题

    elasticsearch-py 解决 too_long_frame_exception 问题 老大让我搞一搞数据统计,配环境时遇到个奇葩错误,记录一下,希望能帮助到某些人. 我需要安装 Elasti ...

  6. mysql-创建用户报错ERROR 1396 (HY000): Operation CREATE USER failed for 'root'@'localhost'

    创建用户: create user ‘test’@’%’ identified by ‘test’; 显示ERROR 1396 (HY000): Operation CREATE USER faile ...

  7. unable to access android sdk add-on list的解决

    第一次安装android studio时候弹出unable to access android sdk add-on list原因是你电脑没有SDK而且你下载的android studio又是不带SD ...

  8. what's the psutil模块

    what's the psutil模块 psutil 是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要用来做系统监控,性能分析,进程管理.它实现 ...

  9. iOS - 截取数组前几个元素放入新的数组,剩余的放入另外一个数组

    NSArray *array = [NSArray arrayWithObjects:@"Crystal",@"Maisie",@"Lukas&quo ...

  10. html2canvas 将网页截图为图片,上传base64 到服务端

    await html2canvas(getById("winyh"), { height:500, allowTaint: true, useCORS: true, }).then ...