アルゴリズム31をソーティングleetcodeが隣接して配置されています

LEETCODE注釈アルゴリズム31:
取得された配列の機能を実装し、所定のアルゴリズムは、辞書的に大きい構成で次のシーケンス番号を再配置が必要です。
次に大きな配列が存在しない場合、再配列アラインメント(すなわち、昇順)の最小数。
あなただけの一定の追加のスペースを許可する、編集を配置する必要があります。
以下は、右の列に対応する出力で、いくつかの例では、左側の入力欄です。
→1,3,2 1,2,3
3,2,1→1,2,3
1,1,5 1,5,1→
ソリューション:まず、辞書式の意味を理解する:数字1,2,3のために... n個配置され、左から右の関係とは異なる配列を順次決定し、対応する番号に1ずつ比較しています。二つの例を説明する:5034150431の
第一及び第二の番号が両方とも同じであり、第三の比較、50341 50431の前に、その後4> 3、。
どこにますます大きな自由配置に出力配列。
アレイはもはや降順に配置されている1>。このような状況扱いやすいです。
次に高い順見つける方法以下に説明2>:6437521のような
、1,2,5,7-がインクリメントされて右から左へ、デジタルアルファベット位置のサイズを決定するには、インクリメンタル位置に不可能です。
数値Aおよび6437521サイズを比較した場合、小さい数5大きい場合によって決まる、フロント4つの命令Aが6437であり、次いで、これ以上3桁の存在下で、5つの数字よりも、可能な説明は6437521より大きくありません。
したがって、インクリメンタル位置特定をしないことを決めました。私たちは、NUMS位置iの[i]の<NUMS [I + 1]を見つける必要があります。この位置は数3です。7521において3つ以上の最小5、交換を発見し、それは6437521よりも大きいが、この時間は数は、6457321となっているが、それは最小ではありません。条件を満たす下降工程7321において6457321は、6451237は次大きく配置されています。

実際には、このとき第一ケースと第二ケースを組み合わせることができます。いいえ配置は、私を見つけることができない大きい位置ではありません。
コードは以下の通りであります:

public class Solution {
    public void nextPermutation(int[] nums) {
        int i = nums.length - 2;
        while (i >= 0 && nums[i + 1] <= nums[i]) {
            i--;
        }
        //当没有找到i时,i=-1,是不会进入if的,直接reverse将数组翻转即可。
        if (i >= 0) {
            int j = nums.length - 1;
            //寻找i之后比i大的最小值做交换
            while (j >= i && nums[j] <= nums[i]) {
                j--;
            }
            swap(nums, i, j);
        }
        reverse(nums, i + 1);
    }

    private void reverse(int[] nums, int start) {
        int i = start, j = nums.length - 1;
        while (i < j) {
            swap(nums, i, j);
            i++;
            j--;
        }
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

リリース5元の記事 ウォンの賞賛1 ビュー76

おすすめ

転載: blog.csdn.net/qq_39502383/article/details/104091702