随机数组最大子数组及数组元素和
(一)
题目:返回一个一维整数数组中最大子数组的和。
要求: 输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
思路:从第一个数开始做加法,若和大于第二个数,则继续加下一个数,若加上第三个数的和大于第三个数,则继续往下加;若小于第三个数,则舍掉前面所有数,并重复此操作;若前两个数的和小于第二个数,则舍掉第一个数。
import java.util.Scanner; public class shuzu { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("请输入数字的数量:"); int n=scanner.nextInt(); int[] a=new int[n]; System.out.println("请输入数组的数值:"); for(int i=0;i<n;i++){ a[i]=scanner.nextInt(); } for(int i=1;i<n;i++){ if(a[i]+a[i-1]>a[i]) a[i]=a[i]+a[i-1]; } int ans=-1000; for(int i=0;i<n;i++) { if(a[i]>ans) ans=a[i];//找取最大值 } System.out.println(ans); } }
结果截图:
(二)
题目:环状数组。
要求:数组首尾相接,且数字不能重复使用。
思路:在第一题的基础上,让a数组的每个数字开头组成n个新的b数组;然后求出每个b数组的子数组的最大和,比较这n个数,最大的即为环状a数组的最大子数组和。
import java.util.Scanner; public class shuzu2 { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("请输入数字的数量:"); int n=scanner.nextInt(); int[] a=new int[n]; System.out.println("请输入数组的数值:"); int m=-1000000; for(int i=0;i<n;i++) { a[i]=scanner.nextInt(); } for(int i=1;i<=n;i++) { int[] b=new int[n]; for(int j=0;j<n;j++) { b[j]=a[(i+j)%n];//让不同的数组开头,形成不同的数组 } m=max(arraymax(b,n),m);//调用函数,取出最大数值 } System.out.println("最大子数组的和为:"+m); } //找出数组中和最大的子数组 public static int arraymax(int[] a,int count) { for(int i=1;i<count;i++) { if(a[i]+a[i-1]>a[i]) a[i]=a[i]+a[i-1]; } int ans=-10000; for(int i=0;i<count;i++) { ans=max(ans,a[i]); } return ans; } public static int max(int ans,int i) { if(ans>i) return ans; else return i; } }
结果截图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律