1. 程式人生 > >貪心思想,非遞減數列

貪心思想,非遞減數列

 

輸入: [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;
    }
}