LeetCode热题100道-Day05

80 阅读1分钟

LeetCode热题100道-Day05

26. 删除有序数组中的重复项

  • 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
}

49. 字母异位词分组

  • 遍历数组,然后对其中的每个值进行排序,如果排序值相同的放进同一个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
}

53. 最大子数组和

  • 动态规划,定义,遍历数组,每一个点有两种情况,要么上一个值
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
}

55. 跳跃游戏

  • 遍历数组,每一步更新可跳到的最大距离。若最后最大距离大于等于数组最后一位,那么说明能到达数组最后一个下标,否则则不能
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
}

58. 最后一个单词的长度

  • 从字符串的后往前模拟判断
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
}