数组的partition调整
題目:
給定一個有序數組arr,調整arr使得這個數組的左邊部分沒有重復元素且升序,而不用保證右半部分是否有序。?
例如,arr = [1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],調整之后arr = [1, 2, 3, 4, 5, 6, 7, 8, 9……]
補充題目:
給定一個數組arr,其中只可能含有0,1,2三個值,請實現arr的排序。?
另一種問法:有一個數組,其中只有紅球、藍球和黃球,請實現紅球全放在數組的左邊,藍球放在中間,黃球放在右邊。?
另一種問法:有一個數組,再給定一個值k,請實現比k小的數都放在數組的左邊,等于k的數都放在數組的中間,比k大的數都放在數組的右邊。
基本思路:
原問題。該數組是有序的,只要將重復的元素放置在數組后部分即可。變量left表示數組中無重復且升序的區域范圍。初始是為0,表示區域arr[0…0]。從位置1開始遍歷數組,如果arr[i] != arr[left],說明該元素可以加到左區域,這時候將左區域擴大一個單位用來放置arr[i],將arr[left]和arr[i]交換并令left+1即可;如果arr[i] == arr[left],說明該元素之前已經出現過,不需要加入到左區域。
補充問題。變量left和right分別表示左右兩個區域,arr[0…left]表示都為0的區域,arr[right…N-1]表示都為2的區域。初始時令left = -1,right = len(arr),表示區域中無任何元素。令index = 0,使用這個變量做從左到右的遍歷,arr[left+1…index]表示都為1的區域。
如果arr[index] == 0,將左區域擴大一個單位來放置該元素,把arr[left+1]和arr[index]交換即可。同時令left、index加1,繼續遍歷下一個位置。
如果arr[index] == 2,將右區域擴大一個單位來放置該元素,把arr[index]和arr[right-1]交換即可,令right減1,同時,index位置的值被更新,繼續從該位置遍歷。
如果arr[index] == 1,直接令index加1,繼續遍歷下一個位置。
?
?
總結
以上是生活随笔為你收集整理的数组的partition调整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 找到指定的新类型字符
- 下一篇: 需要排序的最短子数组长度