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. CSS样式的引入方式

    test.css div{ color:yellow; } 在html中引入 <link href="test.css" type="text/css" ...

  2. kkk

    #!/usr/bin/env python3# coding=utf-8# Author: yannanxiu"""create_rsa_key() - 创建RSA密钥m ...

  3. Linux expect详解

    随处可见的expect第一次见expect这个命令还是我第一次参加全量上线的时候,那是公司的一个牛人用Shell脚本写的一套自动部署.MD5 比对.发布的全量上线工具,没事的时候,看了下其中的几个脚本 ...

  4. Nginx服务器作反向代理实现内部局域网的url转发配置

    情景 由于公司内网有多台服务器的http服务要映射到公司外网静态IP,如果用路由的端口映射来做,就只能一台内网服务器的80端口映射到外网80端口,其他服务器的80端口只能映射到外网的非80端口.非80 ...

  5. [Beta阶段]第三次Scrum Meeting

    Scrum Meeting博客目录 [Beta阶段]第三次Scrum Meeting 基本信息 名称 时间 地点 时长 第三次Scrum Meeting 19/05/05 大运村寝室6楼 30min ...

  6. 深度排序模型概述(一)Wide&Deep/xDeepFM

    本文记录几个在广告和推荐里面rank阶段常用的模型.广告领域机器学习问题的输入其实很大程度了影响了模型的选择,因为输入一般维度非常高,稀疏,同时包含连续性特征和离散型特征.模型即使到现在DeepFM类 ...

  7. Python 使用 win32com 模块对 word 文件进行操作

    what's the win32com 模块 win32com 模块主要为 Python 提供调用 windows 底层组件对 word .Excel.PPT 等进行操作的功能,只能在 Windows ...

  8. json 格式化处理工具

    json 格式化处理工具 用于JSON的快速命令行处理工具,简单无依赖. 我这边列举一些最常用的: 调试 http 请求时打印格式化后的数据 格式化本地或或流中的数据 获取 json 的键值或进行执行 ...

  9. LwIP应用开发笔记之七:LwIP无操作系统HTTP服务器

    前面我们实现了TCP服务器和客户端的简单应用,接下来我们实现一个基于TCP协议的应用协议,那就是HTTP超文本传输协议 1.  HTTP协议简介   超文本传输协议(Hyper Text Transf ...

  10. Tensorflow不同版本要求与CUDA及CUDNN版本对应关系

    参考官网地址: Windows端:https://tensorflow.google.cn/install/source_windows CPUVersion Python version Compi ...