給定一個數組arr,和一個數num,請把小於等於num的數放在數 組的左邊,大於num的數放在數組的右邊。 要求額外空間複雜度O(1),時間複雜度O(N)
思路:兩個指針
void part_num(int arr[], int num, int len){
//方法1
int pre = -1;
int now = 0;
while (now < len){
if (arr[now] < num){
if (++pre != now)
swap(arr[pre], arr[now]);
}
++now;
}
}
void part_num2(int arr[], int num, int len){
//方法1
int left = 0;
int right = len - 1;
while (left < right){
//邊界問題容易出錯
while (arr[left] < num&&left<right)
left++;
while (arr[right]>=num&&right>left)
right--;
swap(arr[left++], arr[right--]);
}
}
問題二(荷蘭國旗問題) 給定一個數組arr,和一個數num,請把小於num的數放在數組的 左邊,等於num的數放在數組的中間,大於num的數放在數組的 右邊。 要求額外空間複雜度O(1),時間複雜度O(N)
類似於上面兩種方法的綜合,一邊找大的,一邊找小的不
void part_num3(int arr[], int num, int len){
int less = -1;
int more = len;
int now = 0;
while (now<more){
if (arr[now] < num)
swap(arr[++less], arr[now++]);
else if (arr[now]>num)
swap(arr[--more], arr[now]);//注意now不能++這裏
else
++now;
}
}