1. 程式人生 > >劍指Offer42:連續子陣列的最大和

劍指Offer42:連續子陣列的最大和

題目:
輸入一個整形陣列,數組裡有正數,也有負數。陣列中的一個或連續多個整陣列成一個子陣列。 求所有子陣列的和的最大值。

/**
	 * 從0開始掃陣列,max=0.
	 * 若累計的和為負數,則及時捨去,從下一位數開始為起點。
	 * 若累計的和不為負數,但所加的下一個數是負數,則要儲存當前的連續子陣列最大值
	 * @param nums
	 * @return
	 */
	public int Method1(int[] nums) {
		if(nums == null || nums.length <= 0)
			return 0;
		/*
		 * 先用陣列中的第一個數初始化一下max和temp
		 */
		int max = nums[0];
		int temp = nums[0];
		
		/*
		 * 從第二個數開始加
		 */
		for(int i = 1; i < nums.length; i++) {
			if(temp < 0) {//如果之前的累加已經為負數了,給這個數自由吧 !讓它本身作為起點
				temp = nums[i]; 
			}else {
				temp = temp + nums[i];
			}
			//儲存最大值
			max = Math.max(temp, max);
		}
		return max;
	}
	
	
	/**
	 * 採用動態規劃的辦法
	 * @param nums
	 * @return
	 */
	public int Method2(int[] nums) {
		if(nums == null || nums.length <= 0)
			return 0;
		
		int[] dp = new int[nums.length]; //用來記錄以第i個結點為末尾的最大連續子陣列
		dp[0] = nums[0];
		int max = nums[0];
		for(int i = 1; i < nums.length; i++) {
			if(dp[i -1] < 0) {
				dp[i] = nums[i];
			}else {
				dp[i] = nums[i] + dp[i -1];
			}
			max = Math.max(max, dp[i]);
		}
		return max;
	}