貪心思想,非遞減數列
阿新 • • 發佈:2018-12-06
輸入: [4,2,3]
輸出: True
解釋: 你可以通過把第一個4變成1來使得它成為一個非遞減數列。
class Solution { public boolean checkPossibility(int[] a) { /* 定義常量來計算交換的次數 如果出現a[i]>a[i+1];應該讓a[i]=a[i+1],變小,才不會影響後續操作 如果有a[i-2]=a[i-1]>a[i]情況,應該讓a[i]=a[i-1] */ int cnt=0; for(int i=1;i<a.length&&cnt<2;i++){ if(a[i]>=a[i-1]){ continue; } cnt++; if(i-2>=0&&a[i]<a[i-2]){ a[i]=a[i-1]; }else{ a[i-1]=a[i]; } } return cnt<=1; } }
輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。
思路:可以計算出相鄰的兩個陣列元素滿足a[i]>a[i-1];然後進行累加
如果a<=b<=c<=d,那麼profile=(d-a)=(b-a)+(c-b)+(d-c)區域性最優即全域性最優
對於 [a, b, c, d],如果有 a <= b <= c <= d ,那麼最大收益為 d - a。而 d - a = (d - c) + (c - b) + (b - a) ,因此當訪問到一個 prices[i] 且 prices[i] - prices[i-1] > 0,那麼就把 prices[i] - prices[i-1] 新增到收益中,從而在區域性最優的情況下也保證全域性最優。
class Solution { public int maxProfit(int[] prices) { int profile=0; for(int i=1;i<prices.length;i++){ if(prices[i]>prices[i-1]){ profile+=prices[i]-prices[i-1]; } } return profile; } }
最大子序列的和:貪心思想:保證了每次的和從非負數開始
class Solution {
public int maxSubArray(int[] nums) {
/*定義一個指標作對照,另外一個元素從1開始遍歷*/
int presum=nums[0];
int maxsum=presum;
for(int i=1;i<nums.length;i++){
presum=presum>0?presum+nums[i]:nums[i];
maxsum=Math.max(maxsum,presum);
}
return maxsum;
}
}
輸入: [7,1,5,3,6,4] 輸出: 5
先求出最小的買入價格,然後求出買入價格後期的賣出價格;因為一天的股票要麼是買入要麼是賣出。如果小於最小股票,就進行買入,否則賣出,並找到賣出的最大利潤。
class Solution {
public int maxProfit(int[] prices) {
if(prices.length==0)return 0;
int minCurnum=prices[0];
int max=0;
for(int i=1;i<prices.length;i++){
if(prices[i]<minCurnum){
minCurnum=prices[i];
}else{
max=Math.max(max,prices[i]-minCurnum);
}
}
return max;
}
}