集合子集和最大问题详解

这是一道很出名的算法题,我们一般第一个想到的思想应该就是,暴力循环查找比较方法,但是一般我想到的方法都可以改进时间复杂度跟空间复杂度,下面就是我的改良算法:

package test;
/** 
* @author HRX
* @version 创建时间:2018年9月28日 下午8:30:26 
* 类说明 
*/
public class Test {
	public static void main(String[] args) {
	int[] num = {-9,-1,5,-3,7,-9,3,-1,-1,-2,4,2,2,2,-1,-5};
	//	int[] num = new int[6];
		int sum = num[0];	//最大子集的和
		int temp = 0;	//临时数用于比较
		//产生随机数组用于测试
//		for(int i=0 ; i<num.length ;i+=2){
//			num[i] = (int) (Math.random()*10);
//			num[i+1] = (int) (-Math.random()*10);
//		}
		//查看数组有的
		for(int x : num)
			System.out.println(x);
		for(int x : num){
			if(temp <= 0){	//当前边自己之和小于等于0时,temp跳到当前位置,sum仍然记录最大值
				temp = temp > 0? temp+x : x;    //temp为负就舍去它,取后边的数
				sum = sum>x ? sum : x;
			}
			else{
				temp += x;
				sum = temp > sum ? temp :sum; 
			}
			System.out.println(temp+"-----------------"+sum);  //测试temp跟sum的每一次过程
		}
		System.out.println("最大子集值:"+sum);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值