最近在学Go语言,但是没怎么练习,因此在leetcode上用Go语言刷算法题巩固一下Go基础。
1. 通配符匹配:44. 通配符匹配 - 力扣(LeetCode) (leetcode-cn.com)解题思路:动态规划,具体思路可见这里。通配符匹配 - 通配符匹配 - 力扣(LeetCode) (leetcode-cn.com)
func isMatch(s string, p string) bool {
lens := len(s)
lenp := len(p)
flag := make([][]bool,lens+1)
for index:=0;index<=lens;index++{
flag[index] = make([]bool,lenp+1)
}
flag[0][0] = true
for index:=1;index<=lenp;index++{
if(p[index-1]=='*'){
flag[0][index]=flag[0][index-1]
}
}
for i:=1;i<=lens;i++{
for j:=1;j<=lenp;j++{
if(s[i-1]==p[j-1]||p[j-1]=='?'){
flag[i][j]=flag[i-1][j-1]
}
if(p[j-1]=='*'){
flag[i][j]=flag[i-1][j]||flag[i][j-1]
}
}
}
return flag[lens][lenp]
}
2. 跳跃游戏II:45. 跳跃游戏 II - 力扣(LeetCode) (leetcode-cn.com)
解题思路:遍历数组中的每一个元素,同时记录维护两个变量,一个为index,一个为next,index和next都是记录下一步可以到达的最长步长,不同的是,next用来记录步长,index用来协助更新最少跳跃次数。
func jump(nums []int) int {
var num int
next := 0
index := 0
for i:=0;i<=len(nums);i++{
if(index>=len(nums)-1){
break
}
if(i+nums[i]>next){
next=i+nums[i]
}
if(i==index){
index=next
num++
}
}
return num
}
3. 全排列:46. 全排列 - 力扣(LeetCode) (leetcode-cn.com)
解题思路:递归回溯,同时使用bool数组协助记录当前的某个值是否已经被填入排列了。
func permute(nums []int) [][]int {
flag := make([]bool,len(nums))
ans := make([][]int,0)
temp := make([]int,0)
find(nums,&flag,&ans,temp)
return ans
}
func find(nums[] int,flag *[]bool,ans *[][]int,temp []int){
if len(temp)==len(nums){
s := make([]int,len(temp))
copy(s,temp)
*ans = append(*ans,s)
return
}
lens := len(nums)
for index:=0;index<lens;index++{
if !(*flag)[index]{
temp = append(temp,nums[index])
(*flag)[index]=true
find(nums,flag,ans,temp)
(*flag)[index]=false
temp = temp[0:len(temp)-1]
}
}
}
4. 全排列II?47. 全排列 II - 力扣(LeetCode) (leetcode-cn.com)
解题思路:思路与上一题基本一致,需要考虑一点是怎么避免重复排列,这里一开始我只考虑了同一元素开头做重复排列的情况,只排除了一部分,还有一部分重复排列做结尾的情况没有考虑到,后面查看官方解法,具体原理还有待思考,关键部分代码为以下:
if (index>0&&nums[index]==nums[index-1]&&!(*flag)[index-1]){
continue
}
func permuteUnique(nums []int) [][]int {
flag := make([]bool,len(nums))
ans := make([][]int,0)
temp := make([]int,0)
sort.Ints(nums)
find(nums,&flag,&ans,temp)
return ans
}
func find(nums []int,flag *[]bool,ans *[][]int,temp []int){
if(len(temp)==len(nums)){
s := make([]int,len(nums))
copy(s,temp)
*ans = append(*ans,s)
return
}
lens := len(nums)
for index:=0;index<lens;index++{
if (index>0&&nums[index]==nums[index-1]&&!(*flag)[index-1]){
continue
}
if !(*flag)[index]{
temp = append(temp,nums[index])
(*flag)[index]=true
find(nums,flag,ans,temp)
(*flag)[index]=false
temp = temp[0:len(temp)-1]
}
}
}
5. 转换图像:48. 旋转图像 - 力扣(LeetCode) (leetcode-cn.com)
解题思路:以每一外圈为一个循环,如
1 2 3
4 6
7 8 9
在这里,1,3,9,7为一组,依次交换位置,2,6,8,4为一组,依次交换位置。需要确定的是组的数量,交换的起始位置,交换的终止位置,然后根据这些向内完成循环即可。
func rotate(matrix [][]int) {
lens := len(matrix)
if lens==0{
return
}
move := lens-1
start := 0
end := lens-1
for ;move>0;{
for i:=0;i<move;i++{
matrix[start][start+i],matrix[start+i][end],matrix[end][end-i],matrix[end-i][start]=matrix[end-i][start],matrix[start][i+start],matrix[start+i][end],matrix[end][end-i]
}
move = move-2
start++
end--
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)