LeetCode热题100道-Day05
- map + 指针, 遍历数组,对每个数进行判断map中是否存在,若不存在,则将该数赋值给i指针指向的数组位置,然后将i指针向前走一步
func removeDuplicates(nums []int) int {
m := make(map[int]bool)
i := 0
for j := 0; j < len(nums); j++ {
v := nums[j]
if _, ok := m[v]; !ok {
m[v] = true
nums[i] = v
i++
}
}
return i
}
- 遍历数组,然后对其中的每个值进行排序,如果排序值相同的放进同一个map的key。这样即可将总字母相同的元素放在一起
func groupAnagrams(strs []string) [][]string {
m := make(map[string][]string)
for _, str := range strs {
s := []byte(str)
sort.Slice(s, func(i, j int) bool {
return s[i] < s[j]
})
c := string(s)
m[c] = append(m[c], str)
}
res := make([][]string, 0)
for _, val := range m {
res = append(res, val)
}
return res
}
- 动态规划,定义,遍历数组,每一个点有两种情况,要么上一个值
func maxSubArray(nums []int) int {
max := nums[0]
for i:=1; i<len(nums); i++ {
if nums[i]+nums[i-1]>nums[i] {
nums[i] = nums[i]+nums[i-1]
}
if nums[i] > max {
max = nums[i]
}
}
return max
}
- 遍历数组,每一步更新可跳到的最大距离。若最后最大距离大于等于数组最后一位,那么说明能到达数组最后一个下标,否则则不能
func canJump(nums []int) bool {
n := len(nums)
count := 0
for i:=0; i<n-1; i++ {
if i+nums[i] > count {
count = i+nums[i]
}
if count <= i {
return false
}
}
return count>=n-1
}
func lengthOfLastWord(s string) int {
res := 0
n := len(s) - 1
flag := 0
for i := n; i >= 0; i-- {
if s[i] == ' ' {
if flag == 0 {
continue
} else {
break
}
}
flag = 1
res++
}
return res
}