lintcode第51 52題 上 下乙個排列

2021-08-20 18:37:20 字數 1738 閱讀 7999

排列中可能包含重複的整數

遇事不決舉個例子:

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...