每日记录(十四)2023.03.06
一、题目要求
1、输入一个整形数组,数组里有正数也有负数。
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为O(n)
import java.util.Scanner;
public class SecondTest {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("输入数组长度:");
int n=input.nextInt();
int [] list = new int [n];
System.out.println("请输入数组内的数字:");
for(int i=0;i<n;i++)
{
int num=input.nextInt();
list[i]=num;
}
int max=Integer.MIN_VALUE;
int sum=0;
for(int i=0;i<n;i++) {
if(list[i]>0) {
sum+=list[i];
max=sum;
}
else {
sum=0;
}
}
System.out.println("最大和是:"+max);
}
}
扩展
若将原数组首尾相连改为环状数组,求其最大子数组的和解决方案如下:
1、通过用户输入数组容量,随机产生一个整型数组
2、遍历数组中的所有元素,保证让其每个元素都作为一次首节点,将其前面的元素拼到原数组最后使其成为一个新数组
3、对每个新数组求一次最大子数组
4、将所有最大子数组的值比较大小,输出最大值
import java.util.ArrayList;
import java.util.Scanner;
public class FirstTest {
public static int getResult(ArrayList<Integer> array) {
int sum = 0;
int result = array.get(0);
for (Integer integer : array) {
if(sum<=0)
sum = integer;
else
sum += integer;
if(sum>result)
result = sum;
}
return result;
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int num=input.nextInt();
int array[]=new int[num];
ArrayList<Integer> result = new ArrayList<>();
for(int i=0;i<num;i++)
{
if((int)(Math.random()*2)==0)
{
array[i]=(int)(Math.random()*10);
}
else
{
array[i]=-(int)(Math.random()*10);
}
}
for(int i=0;i<num;i++) {
System.out.println(array[i]);
}
for(int i=0;i<num;i++) {
ArrayList<Integer> list = new ArrayList<>();
for(int j=i;j<num;j++) {
list.add(array[j]);
}
for(int k=0;k<i;k++) {
list.add(array[k]);
}
result.add(getResult(list));
}
int max = result.get(0);
for (Integer integer : result) {
if(max<integer)
max = integer;
}
System.out.println(max);
}
}

浙公网安备 33010602011771号