Heim > Java > javaLernprogramm > LeetCode DayGreedy-Algorithmen Teil 2

LeetCode DayGreedy-Algorithmen Teil 2

PHPz
Freigeben: 2024-07-16 04:07:01
Original
1086 Leute haben es durchsucht

LeetCode DayGreedy Algorithms Part 2

122. Beste Zeit zum Kaufen und Verkaufen von Aktien II

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

Falscher Code

    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;
    }
Nach dem Login kopieren

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

Feiner Code

    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;
    }
Nach dem Login kopieren

1005. Maximieren Sie die Summe des Arrays nach K Negationen

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;
    }
Nach dem Login kopieren
    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;
    }
Nach dem Login kopieren

45. Sprungspiel II

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage