526. Beautiful Arrangement-- 和46. Permutations 一樣 -back tracking
阿新 • • 發佈:2018-11-16
給一個數N, 產生 一個數列的排列 [1,2,..n]
這個數列符合如下條件 : 第index 個數滿足兩個條件的一個 :1. index % a[index] ==0 或者 2. a[index]%index ==0
分析: 和 46 permutations 完全一樣, 只是需要在dfs 過程中 加上 判斷條件, 並且返回符合結果的個數而不是 排列即可。
code 改了幾個版本:
1. 套用46 模板: 排名 58%
class Solution { public int countArrangement(int N) {int[] nums = new int[N]; for(int i=0; i<N; i++){ nums[i] = i+1; } return dfs(new ArrayList<>(), nums,new boolean[N]); } private int dfs(List<Integer> curResult,int[] nums, boolean[] used){ if(curResult.size() == nums.length){return 1; } int count = 0; for(int i=0; i<nums.length; i++){ if(!used[i]){ int pos = curResult.size()+1; if(nums[i]>= pos && nums[i]%pos!=0) continue; if(pos>=nums[i] && pos%nums[i] !=0) continue; curResult.add(nums[i]); used[i]= true; count += dfs(curResult,nums,used); used[i] = false; curResult.remove(curResult.size()-1); } } return count; } }
2. 去掉 curResult 儲存過程的結果:
class Solution { public int countArrangement(int N) { int[] nums = new int[N]; for(int i=0; i<N; i++){ nums[i] = i+1; } return dfs(0, nums,new boolean[N]); } private int dfs(int pos ,int[] nums, boolean[] used){ if(pos == nums.length){ return 1; } int count = 0; for(int i=0; i<nums.length; i++){ if(!used[i]){ if(nums[i]>= pos+1 && nums[i]%(pos+1)!=0) continue; if(pos+1>=nums[i] && (pos+1)%nums[i] !=0) continue; used[i] = true; count += dfs(pos+1,nums,used); used[i] = false; } } return count; } }
3. 去掉 nums, 只用 下標 :
class Solution { public int countArrangement(int N) { return dfs(0, new boolean[N]); } private int dfs(int pos , boolean[] used){ if(pos == used.length){ return 1; } int count = 0; for(int i=1; i<=used.length; i++){ if(!used[i-1]){ if(i>= pos+1 && i%(pos+1)!=0) continue; if(pos+1>=i && (pos+1)%i !=0) continue; used[i-1] = true; count += dfs(pos+1,used); used[i-1] = false; } } return count; } }