LeetCode热题100道-Day06
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
}
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]
}
}
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+")")
}
}
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}
}
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]
}
}