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. [RN] React Native 打包时 减少 Apk 的大小

    React Native 打包时 减少 Apk 的大小 主要有两个方法: 在打包前设置 android\app\build.gradle 文件中 1) def enableProguardInRele ...

  2. Ubuntu下手动安装vscode

    Ubuntu下手动安装vscode1.下载vscodewget https://vscode.cdn.azure.cn/stable/553cfb2c2205db5f15f3ee8395bbd5cf0 ...

  3. 矩阵的五种分解的matlab实现

    由于这学期修了矩阵分析这门课,课程要求用matlab实现矩阵的5种分解,仅仅是实现了分解,上传到博客存档,万一哪天某位同学就需要了呢.. 1.矩阵的满秩分解 代码实现 %矩阵的满秩分解 clear % ...

  4. JavaScript的filter方法

    var ages = [32, 33, 16, 40]; function checkAdult(age) { return age >= 18; } function myFunction() ...

  5. 哈希表查找(散列表查找) c++实现HashMap

    算法思想: 哈希表 什么是哈希表 在前面讨论的各种结构(线性表.树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较.这一类 ...

  6. 破解magento加密的密码算法

    magento遇到丢掉密码的情况,其实很常见……比如我这记性,还好我比较暴力:-P      先看一段代码:           /**  * Hash a string  *  * @param s ...

  7. git rebase命令

    使用git rebase合并多次commit. 当年提交代码后,管理员发现,你的代码不能提交到服务器上,注意原因在于,你的commit中的commit和服务器中的有些commit不在同一时间轴上,即: ...

  8. thinkphp5---路由问题

    在做thinkphp的开发项目中,遇到一个需求:要求让网站的链接,必须以 .html结尾. 原因:在thinkphp开发的项目中,使用伪静态,路由格式:xxx.com/xxx/2.html ,但是后面 ...

  9. PHP MQTT 实践

    MQTT介绍:http://mqtt.org 服务器端https://mosquitto.org/download/ PHP客户端https://github.com/bluerhinos/phpMQ ...

  10. k8s记录-安装ansible

    ##1.安装1) python版本需要2.6以上,不过通过centos7都会默认安装上python2.7.5,查看方法:python -V2) 添加yum 源a.vim /etc/yum.repos. ...