Leetcode 31. Next Permutation

在这里插入图片描述
方法1: 这道题我自己想法和lc解答2基本一模一样,但是我考虑的还不是最优,lc答案2是最优的。这类题目一般就是你做过就会了,没做过就基本想不出来。这边我给出我自己的代码和lc解答2的代码,复盘的时候看一下解答2 的代码就行。时间复杂n,空间复杂1.

//自己的
class Solution {
    public void nextPermutation(int[] nums) {
        int len = nums.length;
        if(len == 1) return;
        boolean flag = true;
        for(int i = 0; i < nums.length-1; i++){
            if(nums[i] < nums[i+1]) flag = false;
        }
        if(flag == true){
            for (int i = 0; i < len / 2; i++) { 
                int t = nums[i]; 
                nums[i] = nums[len - i - 1]; 
                nums[len - i - 1] = t; 
            } 
            return;
        }
        for(int i = len - 1; i > 0; i--){
            int idx = find(nums, i);
            if(idx != -1){
                int temp = nums[i-1];
                nums[i-1] = nums[idx];
                nums[idx] = temp;
                reorder(nums, i);
                return;
            }
        }
    }
    
    public int find(int[] nums, int i){
        int res = -1;
        int flag = nums[i-1];
        for(int j = nums.length-1; j >= i; j--){
            if(nums[j] > flag){
                res = res == -1 || nums[j] < nums[res] ? j : res;
            }
        }
        return res;
    }
    
    public void reorder(int[] nums, int i){
        if(i == nums.length - 1) return;
        for(int j = i + 1; j < nums.length; j++){
            for(int k = j-1; k >= i; k--){
                if(nums[k+1] < nums[k]){
                    int temp = nums[k+1];
                    nums[k+1] = nums[k];
                    nums[k] = temp;
                }
            }
        }
    }
}
public class Solution {
    public void nextPermutation(int[] nums) {
        int i = nums.length - 2;
        while (i >= 0 && nums[i + 1] <= nums[i]) {
            i--;
        }
        if (i >= 0) {
            int j = nums.length - 1;
            while (j >= 0 && 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;
    }
}

总结:

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页