// 打印结果 for (constauto& perm : ans) {//ans 是一个 vector<vector<int>>,如果写成 for (auto perm : ans),每次循环都会拷贝一个 vector<int>(可能很大),开销不小。用 & 改为引用后,就不会拷贝,直接在原容器里访问元素。加上 const,编译器会阻止你在循环体里意外地修改 perm 的内容 //所以,const auto& 是一种 既高效(无拷贝)又安全(只读)的迭代方式,在只想读取容器元素时非常常见。 cout << "[ "; for (int x : perm) { cout << x << " "; } cout << "]\n"; } return0;
java
感觉和c++语法很相似,但是定义有比较大的区别。Java:所有的对象(除了基本类型)都是通过 new 放到堆(heap)上,JVM 负责垃圾回收。c++写 Solution sol; 或 vector v;,它就是一个栈(stack)上或编译器决定的内存区域里“自动”分配的对象,在作用域结束时立即析构(调用析构函数),内存自动释放。写 new Solution、new vector,才会到堆(free store)上去分配,需要手动 delete(或者用智能指针)来销毁 result.add(path) path.remove(path.size()-1) // Java 使用 List 接口和 ArrayList 实现,C++ 使用 vector List<List> result = new ArrayList<>(); List path = new ArrayList<>(); boolean[] used = new boolean[nums.length];//也有直接用[]的,应该是根据需要调用的算法决定的 Solution sol = new Solution();//这里的sol其实是个指针,引用分配了的内存,但是c++就是在栈上创建了一个实体。写Solution* sol 才是指针,指向 new 出来的对象;也可以写 Solution& sol = *ptr; 来得到一个引用。 int[] nums = {1, 2, 3}; path.size() == nums.length啊?因为path是list,nums是int[] copy:result.add(new ArrayList<>(path));
from typing import List class Solution: def permute(self, nums: List[int]) -> List[List[int]]:在 Python 的类方法里,self 并不是一个关键字,而是一个约定俗成的名字,用来表示「方法正在作用的那个对象实例」——也就是你调用 permute 的那个 Solution 对象本身。sol = Solution() sol.permute([1,2,3])被转换为Solution.permute(sol, [1,2,3])
result: List[List[int]] = [] used = [False] * len(nums) # 标记数组 path: List[int] = [] # 当前构造的排列 len(path) result.append(path[:]) result.append(path.copy()),不然所有对 path 的后续修改,都会反映在 result 里之前所有保存进去的那一份上。 path.pop() for i in range(len(nums)): for j in nums: 可以一维数据一整行一次性输出 for row in matrix: print(row) 也可以逐元素打印
1 2 3
for row in matrix: # 将每个元素转成字符串,用空格连接 print(" ".join(map(str, row)))
或者循环两次。都是直接引用原数组的,不存在深拷贝 enumerate() 是一个内置函数,用来把一个可迭代对象(比如列表)“打包”成一个索引—元素对的迭代器 for i, row in enumerate(matrix):就相当于在每一次循环里同时拿到:i:当前元素在 matrix 中的下标(从 0 开始);row:matrix[i] 对应的那一行(或那一个元素)
go
func permute(nums []int) [][]int {} var result [][]int path := make([]int, 0, len(nums)) used := make([]bool, len(nums)) nums := []int{1, 2, 3} permutations := permute(nums) len(path) res = append(res, tmp) 提前创建一个copy数组,避免后续对 path 的修改,反映在 result 里之前所有保存进去的那一份上。 path = path[:len(path)-1] for i := range nums {} //for i := 0; i < len(matrix); i++{} fmt.Println(permutations) 可以一整行一次性输出for _, row := range matrix { fmt.Println(row)} 或者两次循环。 _, 是空白占位符,表示我们不需要这个变量。range和enumerate是一样的。但是range是必须存在的,不能像python一样直接取row
1 2 3 4 5 6 7
for i, row := range matrix {//可以直接拿到 fmt.Printf("Row %d: ", i) for _, val := range row { fmt.Printf("%d ", val) } fmt.Println() }