問題解決のJavaのシリーズを計画しleetcodeのダイナミック

簡単に売買株式への121のベストタイム题目

 public int maxProfit(int[] prices) {
        int buy=Integer.MAX_VALUE;
        int maxpro=0;
        for(int i=0;i<prices.length;i++){
            buy=Math.min(prices[i],buy);
            maxpro=Math.max(maxpro,prices[i]-buy);
        }
        return maxpro;
    }

746分のコストクライミング階段

現在のコストは、以前のものに依存または2を取ります

public int minCostClimbingStairs(int[] cost) {
        int dp[]=new int[1002];
        dp[0]=cost[0];
        dp[1]=cost[1];
        int n=cost.length;
        for(int i=2;i<n;i++){
            dp[i]=cost[i]+Math.min(dp[i-1],dp[i-2]);
        }
        return Math.min(dp[n-1],dp[n-2]);
    }

70.クライミング階段

思考:i番目の最初のi-1組成物の数と2つのI-2の第二段階に依存

    int climbStairs(int n) {
       if (n == 1)
            return 1;
        if (n < 1)
            return 0;
        
        int dp[n];
        dp[0] = 1;
        dp[1] = 2;

        for (auto i = 2; i < n; i++)
            dp[i] = dp[i - 1] + dp[i - 2];

        return dp[n-1];
    }

53.最大サブアレイ

思考:cursumが負の場合、最大連続配列、cursum初期値は0であり、各々が、スクラッチ、次いで、RES cursum最大の預金をcursum NUM + NUM比較して、最大値の数を横断し且つ

添加剤の場合には、長いハンドルとグローバル最大極大値との関係のように

ローカル[I + 1] = MAX(ローカル[I] + A [i]は、A [I])。

グローバル[I + 1] = MAX(ローカル[I + 1]、グローバル[I])。

    public int maxSubArray(int[] nums) {
        int res=Integer.MIN_VALUE;
        int cursum=0;
        for(int num:nums){
            cursum=Math.max(cursum+num,num);
            res=Math.max(cursum,res);
        }
        return res;
    }

152最高の製品サブアレイ

アイデア:最大の機会サブアレイ。式中、[I]意味サブアレイF [0、i]は範囲内および範囲内に最大サブNUMS [i]は数字の積のアレイ、G [i]が表すサブアレイ[0、I]を含まなければならないとNUMS [I]を含まなければなりませんアレイの数の最小の積、F [0]、G [0]の初期NUMS [0]に初期化されるが、残りはゼロに初期化されます。次いで、第2のデジタルアレイトラバーサルから出発し、次いで、時間のみの3つの図のうち最大値と最小値を生成する、すなわち、F [I-1] * NUMS [I]、G [I-1] * NUMS [I]、およびNUMS [I]。したがって、3のうちの最大値をf [i]は、[i]が最小値gで更新され、次に[I] Fは結果RESに更新され、更新されます

    public int maxProduct(int[] nums) {
        int n=nums.length;
        int f[]=new int[n];
        int g[]=new int[n];
        f[0]=nums[0];
        g[0]=nums[0];
        int res=nums[0];
        for(int i=1;i<n;i++){
            f[i]=Math.max(Math.max(f[i-1]*nums[i],g[i-1]*nums[i]),nums[i]);
            g[i]=Math.min(Math.min(f[i-1]*nums[i],g[i-1]*nums[i]),nums[i]);
            res=Math.max(res,f[i]);
        }
        return res;
    }

198ハウス強盗

思考:漸化式のDP [I] = MAX(NUM [I] + DP [iが - 2]、DP [iが - 1])、我々は、DP初期化する必要があることを示し、[0]、DP [1]、前記DP [0]は、最大でなければならないこの時点でNUM [0]、DP [1]である(NUM [0]、NUM [1])。

 public int rob(int[] nums) {
      int n=nums.length;
        if(n==0)return 0;
        if(n==1)return nums[0];
        int dp[]=new int[n];
        dp[0]=nums[0];
        dp[1]=Math.max(nums[0],nums[1]);
        for(int i=2;i<n;i++){
            dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        return Math.max(dp[n-1],dp[n-2]);
    }

213ハウス強盗II

198アップグレード版は、あなたが頭と尾を削除する必要がある、それは198に2例、呼び出し元のコードに分かれています

public int subrob(int[] nums,int s,int e) {
        int n=e-s+1;
        int dp[]=new int[n];
        dp[0]=nums[s];
        dp[1]=Math.max(nums[s],nums[s+1]);
        for(int i=2;i<n;i++){
            dp[i]=Math.max(dp[i-2]+nums[s+i],dp[i-1]);
        }
        return Math.max(dp[n-1],dp[n-2]);
    }
    public int rob(int[] nums) {
        int n=nums.length;
        if(n==0)return 0;
        if(n==1)return nums[0];
        if(n==2)return Math.max(nums[0],nums[1]);
        return Math.max(subrob(nums,0,nums.length-2),subrob(nums,1,nums.length-1));
    }

 

彼は192元記事に公開 ウォン称賛27 ビューに10万+を

おすすめ

転載: blog.csdn.net/lovely_girl1126/article/details/103496698