【leetcode】46. Permutations

不能偷懶🤐️

網址

題目

Given a collection of distinct integers, return all possible permutations.

Example:

Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

解法

參考 https://www.jianshu.com/p/b81da9ac9af5 圖也來源於此
看到這道題覺得很簡單 想了想排列是如何進行的 草稿紙上畫出了這樣的圖 但卻怎麼都寫不出代碼 ʕノ•ᴥ•ʔノ ︵ ┻━┻
總的來說還是對遞歸太陌生了 自己寫不出來 但看別人代碼能看懂
在這裏插入圖片描述

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if(nums == null || nums.length == 0) return res;
        recursiveSwap(nums, 0, res);
        return res;
    }
    
    private void recursiveSwap(int[] nums, int pos, List<List<Integer>> res){
        if(pos > nums.length-1){
            List<Integer> temp = new ArrayList<>();
            for(int i=0; i<nums.length;i++){
                temp.add(nums[i]);
            }
            System.out.println(temp);
            res.add(temp);
            return;
        }
        for(int i=pos; i<nums.length;i++){
            int tmp = nums[pos];
            nums[pos] = nums[i];
            nums[i] = tmp;     
            
            recursiveSwap(nums, pos+1, res);
            
            tmp = nums[pos];
            nums[pos] = nums[i];
            nums[i] = tmp;                
        }
    }
}

在評論區還看到一種做法 它的思路是每次往之前的res中插入新的值,直到加完爲止。

public static List<List<Integer>> permute(int[] nums) {
	List<List<Integer>> res = new ArrayList<List<Integer>>();
	if (nums.length == 0 || nums == null)
		return res;

	List<Integer> list = new ArrayList<Integer>();
	list.add(nums[0]); // Add the first element into the list;
	res.add(list);
	for (int i = 1; i < nums.length; i++) {
		// Keep track of the size of current result;
		int size = res.size();
		for (int j = 0; j < size; j++) {
			int size2 = res.get(0).size();
			for (int k = 0; k <= size2; k++) {
				List<Integer> temp = new ArrayList(res.get(0));
				temp.add(k, nums[i]);
				res.add(temp);
			}
			res.remove(0);
		}
	}
	return res;
}

由該解法啓發,想到了我原來想寫的做法,不需要遞歸 但是最後排序不太對。。
OS上課太困了 不繼續寫了

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if(nums == null || nums.length == 0) return res;
        
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0;i<nums.length;i++){
            list.add(nums[i]);
        }
        res.add(list); //先往加入一個nums 再慢慢擴充
        for (int pos = 0; pos < nums.length-1; pos++) {
            int size = res.size();
            for (int index = 0; index < size; index++) {
                for (int i = pos+1; i < nums.length; i++) {
                    List<Integer> temp = new ArrayList(res.get(index));
                    int tmp = temp.get(pos);
                    temp.set(pos, temp.get(i));
                    temp.set(i, tmp);
                    System.out.println(temp);
                    res.add(temp);
                }
            }
        }
        return res;

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章