1. 程式人生 > >LeetCode47全排列二

LeetCode47全排列二

昨天沒有寫,今天補上哈。。

題目

給定一個可能包含重複數字的集合,返回所有可能的不同全排列。

例如,
[1,1,2] 有以下不同全排列:

[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

分析

之前寫的是無重複數字的全排列,這次是有重複數字的,這就需要判斷一下是否要進行交換。在加入判斷時,判斷的範圍要注意,因為一開始沒有搞清楚交換的原理啊,錯了很多次,判斷時需要判斷當前陣列區間中是否存在和正在判斷的數字的重複,也就是判斷begin——i之間(而不是往前遍歷一遍整個陣列0——i,這樣是不對的)。

程式碼

class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();

        for (int i = 0; i < nums.length; i++) {
            temp.add(nums[i]);
        }

        allArray(list,temp,0,nums.length);
        return list;
    }

    public void allArray(List<List<Integer>> list, List<Integer> temp, int begin, int end) {
        if (begin == end)
            list.add(new ArrayList<Integer>(temp));

        for (int i = begin; i < temp.size(); ++i) {
            if (isSame(temp, begin, i)) {
                swap(temp, begin, i);
                allArray(list, temp, begin + 1, end);
                swap(temp, begin, i);
            }
        }
    }

    public boolean isSame(List<Integer> temp, int begin, int end){
        for (int i = begin; i < end; i++)
            if (temp.get(i) == temp.get(end))
                return false;
        return true;
    }
    
    public void swap(List<Integer>list, int x, int y){
        int temp = list.get(x);
        list.set(x,list.get(y));
        list.set(y,temp);
    }
}

相關推薦

LeetCode47排列

昨天沒有寫,今天補上哈。。題目給定一個可能包含重複數字的集合,返回所有可能的不同全排列。例如,[1,1,2] 有以下不同全排列:[ [1,1,2], [1,2,1], [2,1,1] ] 分析之前寫的是無重複數字的全排列,這次是有重複數字的,這就需要判斷一下是否要

LeetCode47. 排列 II

題目大意:給定一個含有重複元素的序列,返回這個序列所有不重複的全排列題目分析:與最基本的全排列遞迴演算法相比,本題要對重複的元素進行特別的處理。例如序列“112”,第一個1和第二個1就不需要交換了,因為交換前後排列的序列是重複的。例如序列“211”,當“2”與第一個“1”交換

排列-求解密碼

英文 計算 har tdi font scanf 需要 tr1 顯示 問題:全排列-求解密碼題目描述有某個系統需要密碼才可以進入,現已知密碼中的字符組合為字符串s中的字符(s<=6,s中的每一個字符都是英文字母,沒有數字),但不知其排列順序,請你編寫程序,顯示出該字符

劍指offer():字串的排列 字串 C語言

題目:實現字串的全排列 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 思路:   1.先求出所有可以出現在第一個位置的字元 2.固定第一個

程式設計師程式設計藝術-----第十五 ~ 十章-----排列、跳臺階、奇偶、第一個出現一次字元、一致性hash

第十六~第二十章:全排列,跳臺階,奇偶排序,第一個只出現一次等問題作者:July、2011.10.16。出處:http://blog.csdn.net/v_JULY_v。引言    最近這幾天閒職在家,一忙著投簡歷,二為準備面試而蒐集整理各種面試題。故常常關注個人所建的Algorithms1-14群內朋友關於

[LeetCode] Palindrome Permutation II 迴文排列

Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.

[LeetCode] Permutations II 排列

Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example,[1,1,2] have the following unique perm

遞歸回溯問題的四道經典題:N皇后,組合,排列叉樹路徑和

組合和排列問題的實質是對N叉樹的遍歷,只是退出條件不同。 1.組合 描述:給出兩個整數n和k,返回從1……n中選出的k個數的組合。 樣例: 例如 n = 4 且 k = 2 返回的解為: [[2,4],[3,4],[2,3],[1,2],[1,3

2017.5.3 4.排列

col font ace urn color span 順序輸出 所有 一個 題目描述 給定N(N<10),按照字典序輸出所有的N排列。 輸入 第一行輸入N。 樣例輸入 3 輸出 輸出1到N的全排列,一行一個排列,按照字典序順序輸出。

遞歸解決排列問題

n) for include brush har class log list names #include <bits/stdc++.h> using namespace std; void Perm(char list[],int index,int le

CF459C Pashmak and Buses 打印排列

div pre ota stdlib.h tmp 公交車 能夠 fde int 這題假設將終於的結果豎著看,每一列構成的數能夠看成是k進制的數。一共同擁有d列,隨意兩列都不同樣,所以這就是一個d位k進制數全排列的問題,一共同擁有k ^ d個排列。假設k

[51nod1384]排列

scanf namespace pre strlen next typedef 尾指針 末尾 char 法一:next_permutation函數,兩個參數分別為起始指針和末尾指針。 1 #include<bits/stdc++.h> 2 using

排列(洛谷1061 Jam的計數法or NOIP 2006 普及組 第三題)

div 順序 pre highlight 格式 其中 字符 是個 true Jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文字母計數,他覺得這樣做,會使世界更加豐富多彩。 在他的計數法中,每個數字的位數都是相同的(使用相同個數的字母),英文字母按

python 排列

pop int end 相關 dsm track [] i+1 urn itertools模塊現成的全排列: for i in itertools.permutations(‘abcd‘,4): print ‘‘.join(i) 相關全排列算法: def p

遞歸--練習7--noi1750排列

時間 iostream 而且 sin content sort ble ret param 遞歸--練習7--noi1750全排列 一、心得 二、題目 1750:全排列 總時間限制: 1000ms 內存限制: 65536kB描述 給定一個由不同的小寫字母組成的字符串

n個整數排列的遞歸實現(C++)

code clas 全排列 pop data turn ack popu perm 全排列是很經常使用的一個小算法,以下是n個整數全排列的遞歸實現,使用的是C++ #include <iostream> using namespace std; in

nyoj32(排列)

while -s 意思 ring strong style 之間 個推 是否 題目意思: http://acm.nyist.net/JudgeOnline/problem.php?pid=32 找出從自然數1、2、... 、n(0<n<10)中任取r(0&

next_permutation( ) 和prev_permutation( ) 排列函數

algo clu start prev 都是 它的 ati end 排列組合 頭文件#include <algorithm> 兩者都是用來計算排列組合的函數。前者是求出下一個排列組合,而後者是求出上一個排列組合。 所謂“下一個”和“上一個”,有一個例子; 對序列

9.排列

可能 bsp 復數 image src while sort wap vector 題目: 給定一個數字列表,返回其所有可能的排列。 註意事項 你可以假設沒有重復數字。 class Solution {public: /** * @param n

溫習排列

個數字 append lin urn data- esp int continue javascrip 全排列 題目: 找出從自然數1,2,…… n中任取r個數的組合。比如n=5,r=3。 可用這種遞歸思想來考慮組合函數的算法,設子程序[計算分組子