leetcode 31. Next Permutation
解题思路
题目的意思的找到当前全排列的下一个排列序列。
例如 1,2,3 的全排列
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
那么 1,2,3 下一个就是 1,3,2。
规定: 最后一个的下一个是第一个。 3,2,1 -> 1,2,3
首先,很明显可以发现:如果一个序列是非递增,那么这个序列是不能再重排,获得一个更大的数。
如果把非递增数列看成序列的子结构,那么这一部分将不可以通过重排获得更大的数,只能加入一位数参与重排。重排的方法是从后往前找到第一个前面一个小于后面一个,即a[i] > a[i-1],a[k] <= a[k-1],k > i。 那么把a[i] 与右边的序列重排,如果要使得序列变大同时又尽可能小,那么只能选比a[i]刚好大的a[j],两个交换,这时候还不是最小的,所以要把非递增序列从小到大排列,即把非递增序列反转.
例如:1,2,4,3
,那么 4,3
是一个部分非递增序列,只能加入2
参与重排。3
刚好比 2
大,两个交换变成1,3,4,2
,然后反转成1,3,2,4
.
解题代码
1 | func nextPermutation(nums []int) { |
中间一步可以使用二分查找。不过在leetcode上都是4ms。
1 | func nextPermutation(nums []int) { |
leetcode 33. Search in Rotated Sorted Array
解题思路
第一步,通过二分查找找到翻转点。一开始我是通过比较a[mid]>a[mid+1],如果是则是翻转点,否则检查左边是否a[left]>a[mid]和右边是否a[mid]>a[right],如果左边符合递归检查左边,否则检查右边。
例如:2,4,5,6,7,0,1
明显6
不符合。检查左边2,4,5
,不符合。检查右边7,0,1
,符合。0
不符合,7
大于0
是翻转点。第二步,把两段排好序的序列进行二分查找。
解题代码
1 | func search(nums []int, target int) int { |
参考了别人的寻找翻转点的方法,发现别人的思路实现起来更精简优雅。
1 | func search(nums []int, target int) int { |
利用sort包的二分查找版本
1 | func search(nums []int, target int) int { |
leetcode 46. Permutations
解题思路
复习一下全排列算法。
例如:
1,2,3
如果构造以1开头的全排列,那么可以基于2,3
的全排列。2,3
全排列又可以分为基于2
和3
开头的全排列。如果以2
开头,那么剩下的3
就是自己的全排列。如果以3
开头,那么剩下的2
就是自己的全排列。通过不断减小问题的规模,递归解决问题。
解题代码
1 | func permute(nums []int) (result [][]int) { |
leetcode 48. Rotate Image
解题思路
题目说了顺时针旋转,那么就把矩阵一圈一圈地顺时针转,然后推出以下公式:1
2
3matrix[x][y],matrix[y][n-x-1] = matrix[y][n-x-1],matrix[x][y]
matrix[x][y],matrix[n-x-1][n-y-1] = matrix[n-x-1][n-y-1],matrix[x][y]
matrix[x][y],matrix[n-y-1][x] = matrix[n-y-1][x],matrix[x][y]
解题代码
1 | func rotate(matrix [][]int) { |
leetcode 56. Merge Intervals
解题代码
1 | /** |
leetcode 64. Minimum Path Sum
解题思路
某个格子只能从它的上方和左方来,所以只要最小的那个一步步构造就能得出最优解。
解题代码
1 | func minPathSum(grid [][]int) int { |
leetcode 70. Climbing Stairs
解题代码
1 | var t [101]int |
leetcode 75. Sort Colors
解题代码
1 | func sortColors(nums []int) { |
1 | func sortColors(nums []int) { |
leetcode 78. Subsets
解题思路
递归,缩小问题规模思想。例如[1,2,3]集合的子集可以由[1,2]集合的子集和[1,2]集合的子集加上[3]构成。
1 | [1,2]: |
解题代码
1 | func subsets(nums []int)(result [][]int){ |
leetcode 79. Word Search
解题思路
深搜,标记走过的路径使用特殊字符
解题代码
1 | var dir = [4][]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} |