LeetCode热题100道-Day06

65 阅读1分钟

LeetCode热题100道-Day06

15. 三数之和

  • 三指针
func threeSum(nums []int) (res [][]int) {
   sort.Ints(nums)
   n := len(nums)
   for i := 0; i < n; i++ {
      if nums[i] > 0 {
         break
      }
      if i > 0 && nums[i] == nums[i-1] {
         continue
      }
      n1 := nums[i]
      l := i + 1
      r := n - 1
      for l < r {
         n2, n3 := nums[l], nums[r]
         if n1+n2+n3 > 0 {
            r--
         } else if n1+n2+n3 < 0 {
            l++
         } else {
            res = append(res, []int{n1, n2, n3})
            l++
            r--
            for l < r && nums[l] == n2 {
               l++
            }
            for l < r && nums[r] == n3 {
               r--
            }
         }

      }
   }
   return
}

17. 电话号码的字母组合

  • 递归,遍历所有情况
var m map[int]string = map[int]string{
   '2': "abv",
   '3': "def",
   '4': "ghi",
   '5': "jkl",
   '6': "mno",
   '7': "pqrs",
   '8': "tuv",
   '9': "wxyz",
}
var res []string
var list []byte

func letterCombinations(digits string) []string {
   res = make([]string, 0)
   tra1(0, digits)
   return res
}
func tra1(start int, digits string) {
   if start == len(digits) {
      if len(list) == 0 {
         return
      }
      s := string(list)
      res = append(res, s)
      return
   }
   str := m[int(digits[start])]
   n := len(str)
   for i := 0; i < n; i++ {
      list = append(list, str[i])
      tra1(start+1, digits)
      list = list[:len(list)-1]
   }
}

22. 括号生成

  • 深度优先遍历,遍历并返回所有符合情况的结果
var res []string

func generateParenthesis(n int) []string {
   res = make([]string, 0)
   dfs(n, 0, 0, "")
   return res
}
func dfs(n, l, r int, str string) {
   if l == n && r == n {
      res = append(res, str)
      return
   }
   if l < n {
      dfs(n, l+1, r, str+"(")
   }
   if r < l {
      dfs(n, l, r+1, str+")")
   }
}

34. 在排序数组中查找元素的第一个和最后一个位置

  • 二分搜索,寻找左右边界
func searchRange(nums []int, target int) []int {
	n := len(nums)
	l := 0
	r := n - 1
	for l <= r {
		mid := l + (r-l)/2
		if nums[mid] < target {
			l = mid + 1
		} else if nums[mid] > target {
			r = mid - 1
		} else {
			r = mid - 1
		}
	}
	if l == n || nums[l] != target {
		return []int{-1, -1}
	}

	resL := l
	l = 0
	r = n - 1
	for l <= r {
		mid := l + (r-l)/2
		if nums[mid] < target {
			l = mid + 1
		} else if nums[mid] > target {
			r = mid - 1
		} else {
			l = mid + 1
		}
	}
	return []int{resL, r}
}

39. 组合总和

  • 递归遍历
var res [][]int
var list []int

func combinationSum(candidates []int, target int) [][]int {
   res = make([][]int, 0)
   list = make([]int, 0)
   tra(candidates, 0, target, 0)
   return res
}
func tra(candidates []int, start, target, sum int) {
   if sum == target {
      temp := make([]int, len(list))
      copy(temp, list)
      res = append(res, temp)
      return
   }
   if sum > target {
      return
   }
   for i := start; i < len(candidates); i++ {
      list = append(list, candidates[i])
      tra(candidates, i, target, sum+candidates[i])
      list = list[:len(list)-1]
   }
}