mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 06:07:20 +08:00 
			
		
		
		
	feat: add Swift codes for permutations_problem article (#482)
This commit is contained in:
		@ -59,6 +59,8 @@ let package = Package(
 | 
				
			|||||||
        .executable(name: "preorder_traversal_ii_compact", targets: ["preorder_traversal_ii_compact"]),
 | 
					        .executable(name: "preorder_traversal_ii_compact", targets: ["preorder_traversal_ii_compact"]),
 | 
				
			||||||
        .executable(name: "preorder_traversal_iii_compact", targets: ["preorder_traversal_iii_compact"]),
 | 
					        .executable(name: "preorder_traversal_iii_compact", targets: ["preorder_traversal_iii_compact"]),
 | 
				
			||||||
        .executable(name: "preorder_traversal_iii_template", targets: ["preorder_traversal_iii_template"]),
 | 
					        .executable(name: "preorder_traversal_iii_template", targets: ["preorder_traversal_iii_template"]),
 | 
				
			||||||
 | 
					        .executable(name: "permutations_i", targets: ["permutations_i"]),
 | 
				
			||||||
 | 
					        .executable(name: "permutations_ii", targets: ["permutations_ii"]),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    targets: [
 | 
					    targets: [
 | 
				
			||||||
        // helper
 | 
					        // helper
 | 
				
			||||||
@ -118,5 +120,7 @@ let package = Package(
 | 
				
			|||||||
        .executableTarget(name: "preorder_traversal_ii_compact", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_ii_compact.swift"]),
 | 
					        .executableTarget(name: "preorder_traversal_ii_compact", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_ii_compact.swift"]),
 | 
				
			||||||
        .executableTarget(name: "preorder_traversal_iii_compact", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_iii_compact.swift"]),
 | 
					        .executableTarget(name: "preorder_traversal_iii_compact", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_iii_compact.swift"]),
 | 
				
			||||||
        .executableTarget(name: "preorder_traversal_iii_template", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_iii_template.swift"]),
 | 
					        .executableTarget(name: "preorder_traversal_iii_template", dependencies: ["utils"], path: "chapter_backtracking", sources: ["preorder_traversal_iii_template.swift"]),
 | 
				
			||||||
 | 
					        .executableTarget(name: "permutations_i", path: "chapter_backtracking", sources: ["permutations_i.swift"]),
 | 
				
			||||||
 | 
					        .executableTarget(name: "permutations_ii", path: "chapter_backtracking", sources: ["permutations_ii.swift"]),
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										50
									
								
								codes/swift/chapter_backtracking/permutations_i.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								codes/swift/chapter_backtracking/permutations_i.swift
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * File: permutations_i.swift
 | 
				
			||||||
 | 
					 * Created Time: 2023-04-30
 | 
				
			||||||
 | 
					 * Author: nuomi1 (nuomi1@qq.com)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 回溯算法:全排列 I */
 | 
				
			||||||
 | 
					func backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {
 | 
				
			||||||
 | 
					    // 当状态长度等于元素数量时,记录解
 | 
				
			||||||
 | 
					    if state.count == choices.count {
 | 
				
			||||||
 | 
					        res.append(state)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // 遍历所有选择
 | 
				
			||||||
 | 
					    for (i, choice) in choices.enumerated() {
 | 
				
			||||||
 | 
					        // 剪枝:不允许重复选择元素 且 不允许重复选择相等元素
 | 
				
			||||||
 | 
					        if !selected[i] {
 | 
				
			||||||
 | 
					            // 尝试:做出选择,更新状态
 | 
				
			||||||
 | 
					            selected[i] = true
 | 
				
			||||||
 | 
					            state.append(choice)
 | 
				
			||||||
 | 
					            // 进行下一轮选择
 | 
				
			||||||
 | 
					            backtrack(state: &state, choices: choices, selected: &selected, res: &res)
 | 
				
			||||||
 | 
					            // 回退:撤销选择,恢复到之前的状态
 | 
				
			||||||
 | 
					            selected[i] = false
 | 
				
			||||||
 | 
					            state.removeLast()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 全排列 I */
 | 
				
			||||||
 | 
					func permutationsI(nums: [Int]) -> [[Int]] {
 | 
				
			||||||
 | 
					    var state: [Int] = []
 | 
				
			||||||
 | 
					    var selected = Array(repeating: false, count: nums.count)
 | 
				
			||||||
 | 
					    var res: [[Int]] = []
 | 
				
			||||||
 | 
					    backtrack(state: &state, choices: nums, selected: &selected, res: &res)
 | 
				
			||||||
 | 
					    return res
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@main
 | 
				
			||||||
 | 
					enum PermutationsI {
 | 
				
			||||||
 | 
					    /* Driver Code */
 | 
				
			||||||
 | 
					    static func main() {
 | 
				
			||||||
 | 
					        let nums = [1, 2, 3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let res = permutationsI(nums: nums)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        print("输入数组 nums = \(nums)")
 | 
				
			||||||
 | 
					        print("所有排列 res = \(res)")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										52
									
								
								codes/swift/chapter_backtracking/permutations_ii.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								codes/swift/chapter_backtracking/permutations_ii.swift
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * File: permutations_ii.swift
 | 
				
			||||||
 | 
					 * Created Time: 2023-04-30
 | 
				
			||||||
 | 
					 * Author: nuomi1 (nuomi1@qq.com)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 回溯算法:全排列 II */
 | 
				
			||||||
 | 
					func backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {
 | 
				
			||||||
 | 
					    // 当状态长度等于元素数量时,记录解
 | 
				
			||||||
 | 
					    if state.count == choices.count {
 | 
				
			||||||
 | 
					        res.append(state)
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // 遍历所有选择
 | 
				
			||||||
 | 
					    var duplicated: Set<Int> = []
 | 
				
			||||||
 | 
					    for (i, choice) in choices.enumerated() {
 | 
				
			||||||
 | 
					        // 剪枝:不允许重复选择元素 且 不允许重复选择相等元素
 | 
				
			||||||
 | 
					        if !selected[i], !duplicated.contains(choice) {
 | 
				
			||||||
 | 
					            // 尝试:做出选择,更新状态
 | 
				
			||||||
 | 
					            duplicated.insert(choice) // 记录选择过的元素值
 | 
				
			||||||
 | 
					            selected[i] = true
 | 
				
			||||||
 | 
					            state.append(choice)
 | 
				
			||||||
 | 
					            // 进行下一轮选择
 | 
				
			||||||
 | 
					            backtrack(state: &state, choices: choices, selected: &selected, res: &res)
 | 
				
			||||||
 | 
					            // 回退:撤销选择,恢复到之前的状态
 | 
				
			||||||
 | 
					            selected[i] = false
 | 
				
			||||||
 | 
					            state.removeLast()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 全排列 II */
 | 
				
			||||||
 | 
					func permutationsII(nums: [Int]) -> [[Int]] {
 | 
				
			||||||
 | 
					    var state: [Int] = []
 | 
				
			||||||
 | 
					    var selected = Array(repeating: false, count: nums.count)
 | 
				
			||||||
 | 
					    var res: [[Int]] = []
 | 
				
			||||||
 | 
					    backtrack(state: &state, choices: nums, selected: &selected, res: &res)
 | 
				
			||||||
 | 
					    return res
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@main
 | 
				
			||||||
 | 
					enum PermutationsII {
 | 
				
			||||||
 | 
					    /* Driver Code */
 | 
				
			||||||
 | 
					    static func main() {
 | 
				
			||||||
 | 
					        let nums = [1, 2, 3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let res = permutationsII(nums: nums)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        print("输入数组 nums = \(nums)")
 | 
				
			||||||
 | 
					        print("所有排列 res = \(res)")
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user