排列中可能包含重複的整數
遇事不決舉個例子:
7 6 3 4 5 2 1 下乙個
7 6 3 5 1 2 4 下乙個
7 6 3 5 1 4 2
…………
7 6 3 5 4 2 1 下乙個
7 6 4 1 2 3 5 下乙個
7 6 4 1 2 5 3
似乎找到規律了,
1.從右向左歷遍,找第乙個降序的地方,降序說明這個位置可以變大。
2.從找到的位置向右歷遍,找到比它大的最小值與之交換。
3.因為找到的這個位置右邊都是公升序的,就將這個位置右邊的變為最小的排序。可簡化為整體前後翻轉。
完成過程有了,接下來的就是轉換成**了。
編碼還是比較簡單的,下乙個排列:
class solution
void overturn(vector&nums, int i, int j)
} vectornextpermutation(vector&nums)
int i = nums.size() - 2;
while (i>=0&&nums[i]>=nums[i+1])
if (i<0)
int j = i+1;
while (nums[i]上乙個排列也是相同思路,先舉例,把前邊的例子反過來看就好:
7 6 3 4 5 2 1 下乙個
7 6 3 5 1 2 4 下乙個
7 6 3 5 1 4 2
…………
7 6 3 5 4 2 1 下乙個
7 6 4 1 2 3 5 下乙個
7 6 4 1 2 5 3
流程也出來了,拷貝過來改一下:
1.從右向左歷遍,找第乙個公升序的地方,公升序說明這個位置可以變小。
2.從找到的位置向右歷遍,找到比它小的最大值與之交換。
3.因為找到的這個位置右邊都是降序的,就將這個位置右邊的變為最小的排序。可簡化為整體前後翻轉。
完成class solution
void overturn(vector&nums, int i, int j)
}
vectorpreviouspermuation(vector&nums)
int i = nums.size() - 2;
while (nums[i]<=nums[i+1])
if (i<0)
int j = i+1;
while (nums[i]>nums[j+1])
swap(nums, i, j);
overturn(nums, i + 1, nums.size() - 1);
return nums;
}};
上邊的**改幾個<>號就行了,但是執行時出了錯:
[1,2,1]
[1,0,1]
[1,1,2]
嗯。。。
很神奇,只有陣列交換的操作,卻出現了陣列中不存在的數字,估計是越界了。
檢視**,果然,在
int j = i+1;
while (nums[i]>nums[j+1])
這裡存在越界的可能,如果i為倒數第2個數,j+1就是陣列外的數了,而「下乙個排列」卻通過了所有的測試。。。。
好吧,在這兩句之間加個判斷即可
考研二戰日記 第51 52天小結
昨天結束了最後一次英語四級考試,可以說是我四年來準備的最認真的一次四級了,考完就開始搬宿舍,整理打包,考慮要丟哪些拿哪些。還要一次次運到新住處。要不是有同學幫忙,我真是想把大部分東西全給扔了。搬完之後請他們去吃了頓飯,畢竟我橫插一腳進來撿現成的,還受了這麼多幫助,不表表心意以後我都不好意思和人家一塊...
第6課 變數的高階主題(上)
1.1 變數值的普通替換 1 使用指定字元 串 替換變數值中的字尾字元 串 2 語法格式 var a b 或 1 變數的普通替換 替換字尾 23 src a.cc b.cc c.cc 4 obj 56 test 7 echo obj obj 89 輸出結果10 obj a.o b.o c.o 1.2...
第6課 變數的高階主題(上)
1.1 變數值的普通替換 1 使用指定字元 串 替換變數值中的字尾字元 串 2 語法格式 var a b 或 1 變數的普通替換 替換字尾 23 src a.cc b.cc c.cc 4 obj 56 test 7 echo obj obj 89 輸出結果10 obj a.o b.o c.o 1.2...