簡単に売買株式への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));
}