劍指Offer42:連續子陣列的最大和
阿新 • • 發佈:2018-12-21
題目:
輸入一個整形陣列,數組裡有正數,也有負數。陣列中的一個或連續多個整陣列成一個子陣列。 求所有子陣列的和的最大值。
/** * 從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; }