[剑指offer]面试题第[42]题[Leedcode][JAVA][第53题][最大子序和][动态规划][贪心][分治]

【问题描述】[第53题][最大子序和][中等]

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

【解答思路】

1. 动态规划

思路1
第 1 步:设计状态
int[] temp = new int[len]; 记录前i个和
第 2 步:状态转移方程
前一个i-1+nums[i] 和 nums[i] 作比较
temp[i] = Math.max(temp[i-1]+nums[i],nums[i]);
第 3 步:考虑初始化
temp[0] = nums[0]; max= nums[0];
第 4 步:考虑输出

时间复杂度:O(N) 空间复杂度:O(N)

public int maxSubArray(int[] nums) {if (nums.length == 0)return 0;int[] dp = new int[nums.length];dp[0] = nums[0];int max = dp[0];for (int i=1; i<nums.length; i++){dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);max= Math.max(dp[i],max);}return max;}
2. 贪心算法

在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(1)

  • sum就是这个“i之前最大子数组的和”
  • 如果它大于0,则加上num就是“i+1之前最大子数组的和”
  • 如果它小于0,则num本身就是“i+1之前最大子数组的和”
class Solution {public int maxSubArray(int[] nums) {int ans = nums[0];int sum = 0;for(int num: nums) {if(sum > 0) {sum += num;} else {sum = num;}ans = Math.max(ans, sum);}return ans;}
}
3. 分治算法(可忽略)
  1. 将数组分成左半部分、右半部分和中间包括左右边界的三种区间遍历。
  2. 得到三个区间的最大连续子数组和就是原数组的最大连续子数组和。
  • 本题使用分治不是很理智,copy 大神的方法。
public class Solution {public int maxSubArray(int[] nums) {int len = nums.length;return maxSubArray(nums, 0, len - 1);}private int maxSubArray(int[] nums, int left, int right) {// 只有一个数则直接返回。if (left == right) {return nums[left];}// 找到区间的中间位置。int mid = left + (right - left) / 2;// 返回中间位置左边、右边以及包含中间位置三种情况的能达到的最大子数组和。return Math.max(maxSubArray(nums, left, mid), Math.max(maxSubArray(nums, mid + 1, right), maxCrossingSum(nums, left, mid, right)));}private int maxCrossingSum(int[] nums, int left, int mid, int right) {int sum = 0;// 左边加到 mid 位置能达到的最大和。int leftSum = Integer.MIN_VALUE;// 计算以 mid 结尾的最大的子数组和。for (int i = mid; i >= left; i--) {sum += nums[i];if (sum > leftSum) {leftSum = sum;}}sum = 0;// 右边以 mid 位置开始加能达到的最大和。int rightSum = Integer.MIN_VALUE;// 计算以 mid + 1 开始的最大的子数组和。for (int i = mid + 1; i <= right; i++) {sum += nums[i];if (sum > rightSum) {rightSum = sum;}}// 返回包含 mid 和 mid + 1 两位置数的最大子数组和。return leftSum + rightSum;}
}

【总结】

1.Java中 Math.max 优化if-else 结构
2. 动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

3. 数组初始化
  • 一维数组

1.在定义时初始化。

	int[] arrays = {1, 2, 3, 4, 5};                    //简化int[] arrays = new int[]{1, 2, 3, 4, 5};      //完整格式 推荐

2.先定空间,随后赋值。

- int []age = new int[10];//动态初始化for (int i = 0; i < age.length; i++) {age[i] = i;}
  • 二维数组

1.在定义时初始化。

double[][] a = new double[][] {{1,2,3},{4,2,7}};
double[][] b = new double[][] {{3,3},{1,1},{2,2}};

2.先定空间,随后赋值。

double [][] container = new double[3][4];
for(int i = 0; i < 3;i++) {for(int j = 0; j < 4;j++) {container[i][j] = 4.5;}
}

参考链接:https://leetcode-cn.com/problems/maximum-subarray/solution/53ti-zui-da-zi-xu-he-by-iceblood/
参考链接:https://leetcode-cn.com/problems/maximum-subarray/solution/hua-jie-suan-fa-53-zui-da-zi-xu-he-by-guanpengchn/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排队枪毙游戏c语言,基于C语言实现的约瑟夫生者死者游戏

1 项目简介约瑟夫生者死者游戏的大意是&#xff1a;30个旅客同乘一条船&#xff0c;因为严重超载&#xff0c;加上风高浪大危险万分&#xff1b;因此船长告诉乘客&#xff0c;只有将全船一半的旅客投入海中&#xff0c;其余人才能幸免于难。无奈&#xff0c;大家只得统一这种方…

[Leedcode][JAVA][第983题][最低票价][动态规划]

【问题描述】[第983题][最低票价][中等] 在一个火车旅行很受欢迎的国度&#xff0c;你提前一年计划了一些火车旅行。在接下来的一年里&#xff0c;你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式&#xff1a;一张为…

disperse函数 C语言,武汉工业学院电气1006班C语言测试题.doc

1006班C语言测试题姓名&#xff1a; 学号&#xff1a;1.以下程序的输出结果为( )。   main( )    { int i010,j10;    printf("%d,%d\n",i,j--);   } A 11,9 B 9,10 C 8,10 D 9,92&#xff0e;设a为int型变量&#xff0c;执行下列赋值语句后&#xff0c;a的取…

[Leedcode][JAVA][第572题][另一个树的子树]

【问题描述】 给定两个非空二叉树 s 和 t&#xff0c;检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1: 给定的树 s:3/ \4 5/ \1 2 给定的树 t&#xff1a;4 / \1 2 返回…

LVS在淘宝环境中的应用

目录 1. LVS-简介 2. LVS-问题 3. LVS-fullnat 4. LVS-synproxy 5. LVS-cluster 6. LVS-performance 7. LVS-todo list 疑问引入:用户访问淘宝&#xff0c;访问哪台apache服务器 传统做法&#xff1a;DNS服务 四个问题 Q1&#xff1a;apache2 down&#xff0c;remove生…

android 开发艾特功能,Android Binder

Binder 是一种进程间通信机制&#xff0c;基于开源的 OpenBinder 实现&#xff1b;OpenBinder 起初由 Be Inc. 开发&#xff0c;后由 Plam Inc. 接手。从字面上来解释 Binder 有胶水、粘合剂的意思&#xff0c;顾名思义就是粘和不同的进程&#xff0c;使之实现通信。为什么 Act…

C# Json转对象

第一步&#xff0c;项目添加negut的搜索Newtonsoft.Json&#xff0c;安装第一个&#xff1a;如图所示&#xff1a; 安装以后&#xff0c;自动引用。 private ObservableCollection<Traffic> m_listcls; var json JsonConvert.DeserializeObject<List<Traffic>&…

Dubbo开源

什么是Dubbo? 分布式服务框架 – 远程服务调用 • Ne/y/Mina/Grizzly • RMI/Hessian/WebService – 服务动态发现 • Zookeeper/Redis – 集群软负载均衡 • Random/RoundRobin – 集群失败容错 • Failove…

ionic android 本地存储,ionic2/3本地数据存储storage

ionic2开始storage默认使用的是IndexedDB&#xff0c;而不是LocalStorage存储存储是存储键/值对和JSON对象的简单方法。存储使用下面的各种存储引擎&#xff0c;根据平台选择最佳的存储引擎。当在本机应用程序环境中运行时&#xff0c;Storage将优先使用SQLite&#xff0c;因为…

[Leedcode][JAVA][第470题][Ran7()实现Rand10()]

【问题描述】[Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数&#xff0c;试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法。示例 1:输入: 1 输出: [7] 示例 2:输入: 2 输出: …

时区配置

时区配置 在linux中与时间相关的文件有 /etc/localtime/etc/timezone ##RHEL 7中找不到该文件 其中&#xff0c;/etc/localtime是用来描述本机时间&#xff0c;而 /etc/timezone是用来描述本机所属的时区。 修改本机时区 rm -rf /etc/localtime ln -s /usr/share/zoneinfo/Asi…

推荐系统?淘宝?

目录 • 推荐系统概念 • 淘宝的数据 • 淘宝推荐系统应用场景 • 淘宝推荐系统核心算法 • 淘宝推荐系统的设计 • 推荐系统概念 • 淘宝的数据 • 淘宝推荐系统应用场景 • 淘宝推荐系统核心算法 • 淘宝推荐系统的设计 推荐系统定义 维基百科&#xff1a; form…

android studio 无法输入中文,Android Studio 升级到3.0后输入法中文状态下无法选词的终极解决方案...

AndroidStudio终于出3.0正式版了&#xff0c;内置了kotlin(虽然我安了插件一直能用)。一直忍着没敢下rc版的好奇猫&#xff0c;总算装了正式版。当然&#xff0c;伴随每次大版本更新&#xff0c;总有一些恼人的后遗症&#xff0c;其中以gradle问题最多。AS3.0要求gradle版本在3…

[Leedcode][JAVA][第136题][第137题][只出现一次的数字][位运算][HashSet][HashMap]

【问题描述】[第136&#xff0c;137题][只出现一次的数字] 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现了N次。找出那个只出现了一次的元素。[第136题]N 2 输入: [2,2,1] 输出: 1 [第137题]N3 输入: [2,2,3,2] 输出: 3【解答…

[Swift通天遁地]七、数据与安全-(12)使用Instruments Leaks工具检测内存泄露

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

java学习(174):constructor类反射编程

//class反射编程 //定义一个学生类 public class test124 {public String name;protected int age;double height;private double money;public void setName(String name) {this.name name;}public String getName() {return name;}public int getAge() {return age;}public …

android 4.2 noclassdeffounderror,NoClassDefFoundError:android.support.v7.internal

运行Android 4.2的三星设备上的Android appcompat v7库存在问题。在我的开发者控制台中&#xff0c;我不断遇到以下堆栈跟踪崩溃&#xff1a;java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilderat android.support.v7.widget.PopupMenu.(Popu…

[国密算法]一文了解国密算法

国密算法概述1 SM1对称密码2 SM2椭圆曲线公钥密码算法3 SM3杂凑算法4 SM4对称算法5 SM7对称密码6 SM9标识密码算法7 ZUC祖冲之算法总结算法名称算法类别应用领域特点SM1对称密码算法芯片分组长度、密钥长度均为 128 比特SM2公钥密码算法加密ECC椭圆曲线密码机制256位 相比RSA&a…

java学习(175):method类反射机制

//class反射编程 //定义一个学生类 public class test124 {public String name;protected int age;double height;private double money;public void setName(String name) {this.name name;}public String getName() {return name;}public int getAge() {return age;}public …

java-web的mybatis的学习

idea开发必须是把Mapper文件与配置文件放到Resources标记的classpath目录下&#xff0c;eclips好像放到哪都行指定好路径就可以了&#xff0c; maven里面做好配置resources的路径&#xff0c;不然更新依赖 工程结构标记又没了 <build> <resources> <resour…