下記の問題について、どのようにして解放がおもいつき、実装完了まで辿り着くことができますでしょうか?
恐らく、ふわっと大枠3つの方針があるかと思います。
- 順列の数式を思い浮かべながら解く。
- まずは、木構造で問題を表現してみて、課題の見通しをよくする。
- とりあえず、for文で書いてみてから再帰に書き換える。
上記をつかったそれぞれの解き方については、様々な動画や書籍を探って理解したつもりには、なっていますが、もしこれに似たような問題がでてきたときに、上記、3つの方法で具体的に実装までして解ききることができるかというと怪しいです。
問題
Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order. Input: nums = [1,2,3,4] Output: [[1, 2, 3, 4], [2, 1, 3, 4], [3, 2, 1, 4], [1, 3, 2, 4], [3, 1, 2, 4], [2, 3, 1, 4], [4, 2, 3, 1], [1, 4, 3, 2], [1, 2, 4, 3], [4, 1, 3, 2], [2, 4, 3, 1], [2, 1, 4, 3], [4, 2, 1, 3], [3, 4, 1, 2], [3, 2, 4, 1], [4, 3, 2, 1], [1, 4, 2, 3], [1, 3, 4, 2], [4, 1, 2, 3], [3, 4, 2, 1], [3, 1, 4, 2], [4, 3, 1, 2], [2, 4, 1, 3], [2, 3, 4, 1]]
出典元:46. Permutations
私がやってみたプロセス:
まず、[1,2,3,4]という少ないインプットで考え、下記の2つのコードを書きました。
コード1
python
1def perm(nums): 2 if len(nums) <= 1: 3 return [nums] 4 5 first = nums[0:1] 6 rest = nums[1:] 7 8 for i in range(len(nums)): 9 print(rest[:i] + first + rest[i:]) 10 return rest
こちらのコードは、スライシングを使うことでindexをずらしながら順番を入れ替えています。このスライシングに利用しているindexをより動的にすることができれば、解答に近づけそう、とこの段階では思いました。再帰をつかうのかなとは思いつきました。
コード2
python
1def perm(nums): 2 nums_list = [] 3 for _ in range(len(nums)): 4 for i in range(1, len(nums)): 5 nums[i-1], nums[i] = nums[i], nums[i-1] 6 nums_list.append(nums.copy()) 7 return nums_list
こちらのコードは、in-placeをすることで順番にバブルソートをしています。しかし、バブルソートをしているがゆえに隣同士の並び替えしかおこなわれず、
一周目のfor文は、[2, 1, 3, 4], [2, 3, 1, 4], [2, 3, 4, 1]
のようなアウトプットしかださず、真ん中にある数字たちの場所が入れ替わった組み合わせをだすことができません。こちらは、もう一つループを追加して三重ループにすることで解答に近づけそうかなと思いました。
問題は、ここからです。
このさきのコードを何をどう実装していけばいのか、具体的に思い浮かばず、手が進みませんでした。
恐らく、再帰をつかった解答と三重ループを利用した解答があるかと思っています。
それぞれの解答とその解答にどうやって至ったか、どうして思いついたのかについてご教示頂けませんでしょうか?
回答4件
あなたの回答
tips
プレビュー