hot100之数组
最大子数组和(053)
先看代码
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
int subSum = 0;
int res = nums[0];
for (int i = 0; i < n; i++){
subSum = Math.max(nums[i], subSum+nums[i]);
res = Math.max(res, subSum);
}
return res;
}
}
- 分析
贪心+动态规划
判断前子数组是否对 subSum 产生负影响, 产生影响则放弃前子数组, 重新开始新的子数组
动态规划体现在计算当前的子数组和时,需要考虑前面的子数组和是否对当前有贡献。贪心体现在如果前面的子数组和为负数,就直接舍弃重新开始计算。这道题的关键在于理解subSum代表以当前元素结尾的最大子数组和。
- 感悟
因为前值会对后值产生影响 , 让人自然想到动态规划
由于后值只需要前一个状态的值 我们可以用 subSum作滚动计算 ,优化空间复杂度
合并区间(056)
先看代码
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (p, q)-> p[0] - q[0]);
List<int []> res = new ArrayList<>();
for(int[] p : intervals){
int m = res.size();
if (m > 0 && p[0] <= res.get(m-1)[1]){
res.get(m-1)[1] = Math.max(res.get(m-1)[1], p[1]);
}else res.add(p);
}
return res.toArray(new int[res.size()][]);
}
}
- 分析
利用左端点进行排序, 再组合
- 感悟
左端点排序可以不破坏p[k-1]与 p[k]一致, 递增
轮转数组(189)
先看代码
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
k %= n;
reverse(nums, 0, n-1);
reverse(nums, 0, k-1);
reverse(nums, k, n-1);
}
private void reverse(int[] nums, int lef, int rig){
while (lef < rig){
int temp = nums[lef];
nums[lef++] = nums[rig];
nums[rig--] = temp;
}
}
}
- 分析
先对整体数组翻转, 在以k为节点 左右各自翻转
- 感悟
数学 真神奇吧
除自身以外数的乘积(238)
先看代码
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] preSum = new int[n];
preSum[0] = 1;
int[] sufSum = new int[n];
sufSum[n-1] = 1;
for(int i = 1; i < n ; i++){
preSum[i] = preSum[i-1] * nums[i-1];
}
for(int i = n-2; i >= 0; i--){
sufSum[i] = sufSum[i+1] * nums[i+1];
}
int[] res = new int[n];
for(int i = 0; i < n; i++){
res[i] = preSum[i] * sufSum[i];
}
return res;
}
}
- 分析
分别计算数组的前缀积与后缀积
用 i之前的前缀积 * i之和的后缀积
res[i] = preSum[i] * sufSum[i]
preSum[0] = 1 sufSum[n-1] = 1
可知 preSum[i] 为 num[0] * …. * num[i-1]
同理 sufSum[i] 为 num[n-1] * …. * num[i+1]
可知preSum[i] * sufSum[i]不包含 num[i]
- 感悟
分解数据的前后缀再求解
缺失的第一个正数(041)
先看代码
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for (int i = 0; i < n; i++){
while(0 < nums[i] && nums[i] <= n && nums[i] != nums[nums[i] - 1]){
int j = nums[i] - 1;
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
}
for (int i = 0; i < n; i++){
if (nums[i] != i+1){
return i+1;
}
}
return n+1;
}
}
- 分析
还是分座位, 如果i号座位上坐的人不是i , 让出座位给i
- 感悟
将理论问题生活化. 生活中的一个直觉, 背后可能有丰富的理论
hot100之数组的更多相关文章
- leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用
提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...
- javascript数组查重方法总结
文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
随机推荐
- pve节点频繁宕机问题排查
1.时间: 我是大概20220521日上午11:03分收到这个事情开始跟进: 再这之前一直是其他同事在处理,由于最近比较忙,没有安排的事情基本也都没有深入跟进,只是知道个大概. 2.问题现象: q ...
- Vmware ESXi 是免费吗?一文弄懂vSphere功能特性及ESXi与vSphere到底有什么区别和联系。
目录 收起 一.对VMware vSphere及ESXi的相关疑问 1.Vmware vSphere 有些什么功能? 2.ESXi 是否真正免费? 3. ESXi 和 vSphere 到底有什么区别, ...
- 关于IPMP
国际项目经理资质认证(International Project Manager Professional,简称IPMP)是国际项目管理协会(International Project Managem ...
- 在IIS Express下部署NuGet私服
用途 个人开发,部署自己的NuGet pkg. 环境 Win11 IIS Express (轻度使用,不安装IIS,而使用VS预装的IIS Express) VS2022 步骤 开发环境准备 因我拟用 ...
- 【教程】Anaconda安装
零.Anaconda介绍 Anaconda个人版是一个免费.易于安装的包管理器.环境管理器和Python发行版(所以装了Anaconda就可以不用再另外装Python了),有提供非常多的开源包,用An ...
- frxpngimage单元的编译错误:frxpngimage left side cannot be assigned to
一个老项目中,使用软数字录入数据,编译时出现n个:frxpngimage left side cannot be assigned to 原因是使用了frxpngimage单元,在D11中编译出现若干 ...
- AIR724UG上电后引脚的默认电平
使用AIR724UG的引脚作为继电器的控制引脚时,由于上电时引脚的电平有的高,有的低. 在某些场合我们希望GPIO上电默认是低电平,所以我将常用引脚中可用的引脚标注了出来.
- kettle介绍-Step之CSV Input
CSV Input/CSV 文件输入介绍 CSV 文件输入步骤主要用于将 CSV 格式的文本文件按照一定的格式输入至 流中 Step name:步骤的名称,在单一转换中,名称必须唯一 Filename ...
- cocos3 Shader的CCProgram模板详解
这段内容描述的是一个 着色器(Shader) 的基本结构模板,可能用于一种自定义的着色器语言或框架(例如基于某种图形渲染引擎或中间表示语言扩展的着色器定义方式).以下是逐部分解析其含义: 1. CCP ...
- 有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案
有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案 本实例是在DataGrid的详情行里再嵌入一个DataGrid,模拟重叠 ...