Algorithmus Leetcode | 75. Farbklassifizierung (Rost schlägt hart)



75. Farbklassifizierung:

Sortieren Sie ein gegebenes nArray mit roten, weißen und blauen Elementen so nums, 原地dass Elemente derselben Farbe in der Reihenfolge Rot, Weiß und Blau nebeneinander liegen.

Wir verwenden Ganzzahlen 0, 1und 2zur Bezeichnung von Rot, Weiß bzw. Blau.

Dieses Problem muss gelöst werden, ohne die integrierte Sortierfunktion der Bibliothek zu verwenden.

Beispiel 1:

输入:
	
	nums = [2,0,2,1,1,0]
	
输出:
	
	[0,0,1,1,2,2]

Beispiel 2:

输入:
	
	nums = [2,0,1]
	
输出:
	
	[0,1,2]

Hinweis:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] ist 0, 1 oder 2

analysieren:

  • Angesichts dieses Algorithmusproblems geriet der zweite Leiter erneut in tiefe Gedanken.
  • Der intuitivste Weg besteht darin, zweimal zu durchlaufen, zuerst von links nach rechts zu durchlaufen, um Rot nach links zu ändern, und dann von rechts nach links zu durchlaufen, um Blau nach rechts zu ändern, zusätzlicher Raum auf konstantem Niveau, O (n) Zeitkomplexität Es ist schon sehr gut, welches Fahrrad und welche Uhr man braucht, es ist so einfach und leicht zu verstehen.
  • Der Algorithmus muss jedoch so weit wie möglich optimiert werden. Ja, wir haben ihn zweimal durchlaufen. Können wir ihn nur einmal durchlaufen?
  • Dann müssen Sie in einem Durchlauf Rot nach links und Blau nach rechts ändern. Gibt es eine gute Möglichkeit? Beachten Sie ein Detail, der Titel erfordert, dass die integrierte Sortierung nicht verwendet werden kann. Warum? Die zeitliche Komplexität eines hervorragenden Sortieralgorithmus beträgt ebenfalls O(n*log n). Warum nicht zweimal durchlaufen, was zum Teufel? Plötzlich änderte ich meine Meinung, der allgemeine eingebaute Sortieralgorithmus ist die schnelle Sortierung , und dann dachte ich an ein Fragment der schnellen Sortierung, das darin besteht, eine Referenznummer zu finden und dann alle Elemente, die kleiner als die Referenznummer sind, nach links zu verschieben die Referenznummer und Elemente, die größer als die Referenznummer sind. Die Elemente werden alle nach rechts von der Referenznummer verschoben. Wie wäre es damit, ist es plötzlich klar? Ist das nicht die Antwort?
  • Verwenden Sie Doppelzeiger, um die roten und blauen Ränder am Kopf bzw. am Ende darzustellen, und durchlaufen Sie dann die Elemente. Wenn es rot ist, wechseln Sie zum roten Rand links und verschieben Sie den roten Rand. Wenn er blau ist, wechseln Sie zum Blauen Rand auf der rechten Seite und Verschieben Sie den blauen Rand. Wenn er weiß ist, verarbeiten Sie ihn nicht und fahren Sie mit dem Durchlaufen des nächsten Elements fort.

Antwort:

Rost:

impl Solution {
    
    
    pub fn sort_colors(nums: &mut Vec<i32>) {
    
    
        let (mut i, mut l, mut r) = (0, 0, nums.len() - 1);
        while i <= r {
    
    
            if nums[i] < 1 {
    
    
                if i == l {
    
    
                    i += 1;
                } else {
    
    
                    nums.swap(i, l);
                }
                l += 1;
            } else if nums[i] > 1 {
    
    
                if i == r {
    
    
                    break;
                }
                nums.swap(i, r);
                r -= 1;
            } else {
    
    
                i += 1;
            }
        }
    }
}

gehen:

func sortColors(nums []int)  {
    
    
    i, l, r := 0, 0, len(nums)-1
	for i <= r {
    
    
		if nums[i] < 1 {
    
    
			if i == l {
    
    
				i++
			} else {
    
    
				nums[i], nums[l] = nums[l], nums[i]
			}
			l++
		} else if nums[i] > 1 {
    
    
			if i == r {
    
    
				break
			}
			nums[i], nums[r] = nums[r], nums[i]
			r--
		} else {
    
    
			i++
		}
	}
}

c++:

class Solution {
    
    
public:
    void sortColors(vector<int>& nums) {
    
    
        int i = 0, l = 0, r = nums.size() - 1;
        while (i <= r) {
    
    
            if (nums[i] < 1) {
    
    
                if (i == l) {
    
    
                    ++i;
                } else {
    
    
                    swap(nums[i], nums[l]);
                }
                ++l;
            } else if (nums[i] > 1) {
    
    
                if (i == r) {
    
    
                    break;
                }
                swap(nums[i], nums[r]);
                --r;
            } else {
    
    
                ++i;
            }
        }
    }
};

Python:

class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i, l, r = 0, 0, len(nums) - 1
        while i <= r:
            if nums[i] < 1:
                if i == l:
                    i += 1
                else:
                    nums[i], nums[l] = nums[l], nums[i]
                l += 1
            elif nums[i] > 1:
                if i == r:
                    break
                nums[i], nums[r] = nums[r], nums[i]
                r -= 1
            else:
                i += 1


Java:

class Solution {
    
    
    public void sortColors(int[] nums) {
    
    
        int i = 0, l = 0, r = nums.length - 1;
        while (i <= r) {
    
    
            if (nums[i] < 1) {
    
    
                if (i == l) {
    
    
                    ++i;
                } else {
    
    
                    int t = nums[i];
                    nums[i] = nums[l];
                    nums[l] = t;
                }
                ++l;
            } else if (nums[i] > 1) {
    
    
                if (i == r) {
    
    
                    break;
                }
                int t = nums[i];
                nums[i] = nums[r];
                nums[r] = t;
                --r;
            } else {
    
    
                ++i;
            }
        }
    }
}

Vielen Dank, dass Sie diesen Artikel gelesen haben ~
Willkommen bei [Gefällt mir] [Favorit] [Kommentar] Gehen Sie dreimal hintereinander ~ Es ist
nicht schwer aufzugeben, aber es muss cool sein ~
Ich hoffe, wir können uns alle jeden Tag ein wenig verbessern ~
Dieser Artikel wurde vom White Hat des zweiten Meisters geschrieben: https://le-yi.blog.csdn.net/Blog original~


おすすめ

転載: blog.csdn.net/leyi520/article/details/132608796