Sie erhalten ein ganzzahliges Array von Preisen, wobei „Preise[i]“ der Preis einer bestimmten Aktie am i-ten Tag ist.
An jedem Tag können Sie entscheiden, die Aktie zu kaufen und/oder zu verkaufen. Sie können jeweils nur höchstens eine Aktie halten. Sie können es jedoch kaufen und dann noch am selben Tag sofort verkaufen.
Finden und erzielen Sie den maximalen Gewinn, den Sie erzielen können.
Beispiel 1:
Eingabe: Preise = [7,1,5,3,6,4]
Ausgabe: 7
Erläuterung: Kaufen Sie am 2. Tag (Preis = 1) und verkaufen Sie am 3. Tag (Preis = 5), Gewinn = 5-1 = 4.
Dann kaufen Sie am 4. Tag (Preis = 3) und verkaufen am 5. Tag (Preis = 6), Gewinn = 6-3 = 3.
Der Gesamtgewinn beträgt 4 + 3 = 7.
Beispiel 2:
Eingabe: Preise = [1,2,3,4,5]
Ausgabe: 4
Erläuterung: Kaufen Sie am Tag 1 (Preis = 1) und verkaufen Sie am Tag 5 (Preis = 5), Gewinn = 5-1 = 4.
Der Gesamtgewinn beträgt 4.
Beispiel 3:
Eingabe: Preise = [7,6,4,3,1]
Ausgabe: 0
Erläuterung: Es gibt keine Möglichkeit, einen positiven Gewinn zu erzielen, daher kaufen wir niemals die Aktie, um den maximalen Gewinn von 0 zu erzielen.
Einschränkungen:
1 <= Preise.Länge <= 3 * 104
0 <= Preise[i] <= 104
Originalseite
public int maxProfit(int[] prices) { int profit = 0; int buy = Integer.MAX_VALUE; int sum = 0; int peek = 0; for(int i=0; i<prices.length; i++){ int num = prices[i]; if(num > buy && num > peek){ profit = num - buy; peek = num; } else if((num>buy && num<peek) || num < buy){ sum += profit; profit = 0; buy = num; peek = num; } } return sum+profit; }
Ich initiiere den Kauf auf int MAX_VALUE und vergesse zu aktualisieren. Dies kann zu einem Fehler führen.
Beheben Sie das Problem und kürzen Sie die Codes
public int maxProfit(int[] prices) { if(prices.length <1){ return 0; } int profit = 0; int buy = prices[0]; int sum = 0; int peek = prices[0]; for(int i=0; i<prices.length; i++){ int num = prices[i]; if( num > peek){ profit = num - buy; peek = num; } else if(num<peek){ sum += profit; profit = 0; buy = num; peek = num; } } sum += profit; return sum; }
Gegeben ein ganzzahliges Array nums und eine ganze Zahl k, ändern Sie das Array wie folgt:
Wählen Sie einen Index i und ersetzen Sie nums[i] durch -nums[i].
Sie sollten diesen Vorgang genau k-mal anwenden. Sie können denselben Index mehrmals auswählen.
Gibt die größtmögliche Summe des Arrays zurück, nachdem es auf diese Weise geändert wurde.
Beispiel 1:
Eingabe: nums = [4,2,3], k = 1
Ausgabe: 5
Erläuterung: Wählen Sie Index 1 und nums wird zu [4,-2,3].
Beispiel 2:
Eingabe: nums = [3,-1,0,2], k = 3
Ausgabe: 6
Erläuterung: Wählen Sie Indizes (1, 2, 2) und Nums wird zu [3,1,0,2].
Beispiel 3:
Eingabe: nums = [2,-3,-1,5,-4], k = 2
Ausgabe: 13
Erläuterung: Wählen Sie die Indizes (1, 4) und die Zahl wird zu [2,3,-1,5,4].
Einschränkungen:
1 <= nums.length <= 10^4
-100 <= nums[i] <= 100
1 <= k <= 10^4
Originalseite
public int largestSumAfterKNegations(int[] nums, int k) { Arrays.sort(nums); int change = nums[nums.length-1] >=0?0:nums.length-1; int sum = 0; for(int i=0; i<nums.length; i++){ if(nums[i] < 0 && k>0){ sum -= nums[i]; k--; }else{ sum += nums[i]; } // find the cross over if(i>0 && nums[i-1]<=0 && nums[i]>0){ if(-nums[i-1]>nums[i]){ change = i; }else{ change = i-1; } } } // k>nums.length so we need to run out of these k if(k>0){ if(k%2!=0){ //find the min abs value sum -= 2*Math.abs(nums[change]); } } return sum; } </p> <h2> 55. Sprungspiel </h2> <p>Sie erhalten ein ganzzahliges Array mit Zahlen. Sie befinden sich zunächst am ersten Index des Arrays und jedes Element im Array stellt Ihre maximale Sprunglänge an dieser Position dar.</p> <p>Gib true zurück, wenn du den letzten Index erreichen kannst, andernfalls false.</p> <p>Beispiel 1:</p> <p>Eingabe: nums = [2,3,1,1,4]<br> Ausgabe: true<br> Erläuterung: Springe 1 Schritt von Index 0 zu 1, dann 3 Schritte zum letzten Index.<br> Beispiel 2:</p> <p>Eingabe: nums = [3,2,1,0,4]<br> Ausgabe: false<br> Erläuterung: Sie werden immer bei Index 3 ankommen, egal was passiert. Seine maximale Sprunglänge beträgt 0, was es unmöglich macht, den letzten Index zu erreichen.</p> <p>Einschränkungen:</p> <p>1 <= nums.length <= 10^4<br> 0 <= nums[i] <= 10^5</p> <h2> Falscher Code </h2> <pre class="brush:php;toolbar:false"> public boolean canJump(int[] nums) { //find whether achive the last element so that we only can see whether can reach the second last element for(int i=0; i<nums.length-1;){ int size = nums[i]; int next = 0; int nextVal = 0; if(size == 0){ return false; } if(i+size >= nums.length){ return true; } //find the max steps among the current step for(int j=0; j<=size; j++){ // calculate max for both index and value if(i+j+nums[i+j]>next){ next = i+j+nums[i+j]; } } i = next; } return true; } </p> <h2> Falscher Code 2 </h2> <pre class="brush:php;toolbar:false"> public boolean canJump(int[] nums) { if(nums.length==1){ return true; } if(nums[0] == 0){ return false; } for(int i=0; i<nums.length-1; i++){ if(i+nums[i]>=nums.length-1){ return true; } } return false; }
public boolean canJump(int[] nums) { if(nums.length==1){ return true; } int range = 0; for(int i=0; i<=range; i++){ range = Math.max(range, i+nums[i]); if(range >= nums.length-1){ return true; } } return false; }
Sie erhalten ein 0-indiziertes Array von ganzen Zahlen der Länge n. Sie befinden sich zunächst bei nums[0].
Jedes Element nums[i] stellt die maximale Länge eines Vorwärtssprungs vom Index i dar. Mit anderen Worten, wenn Sie sich bei nums[i] befinden, können Sie zu jedem beliebigen nums[i + j] springen, wobei:
0 <= j <= nums[i] und
i + j < n
Gibt die Mindestanzahl an Sprüngen zurück, um Nums[n - 1] zu erreichen. Die Testfälle werden so generiert, dass Sie nums[n - 1] erreichen können.
Beispiel 1:
Eingabe: nums = [2,3,1,1,4]
Ausgabe: 2
Erläuterung: Die Mindestanzahl an Sprüngen zum Erreichen des letzten Index beträgt 2. Springen Sie 1 Schritt von Index 0 auf 1 und dann 3 Schritte zum letzten Index.
Beispiel 2:
Eingabe: nums = [2,3,0,1,4]
Ausgabe: 2
Einschränkungen:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
Es ist garantiert, dass Sie nums[n - 1] erreichen können.
public int jump(int[] nums) { if(nums.length == 1){ return 0; } int step = 0; int range = 0; int preRange = 0; for(int i=0; i= nums.length-1){ step++; break; } if(i == preRange){ preRange = range; step++; } } return step; } Das obige ist der detaillierte Inhalt vonLeetCode DayGreedy-Algorithmen Teil 2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!