• LeetCode 热题 100——两数之和、字母异位词分组、最长连续序列


    两数之和

    题目链接

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

    你可以按任意顺序返回答案。

    示例 1:

    输入:nums = [2,7,11,15], target = 9
    输出:[0,1]
    解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
    
    • 1
    • 2
    • 3

    示例 2:

    输入:nums = [3,2,4], target = 6
    输出:[1,2]
    
    • 1
    • 2

    示例 3:

    输入:nums = [3,3], target = 6
    输出:[0,1]
    
    • 1
    • 2

    提示:

    • 2 <= nums.length <= 104
    • -109 <= nums[i] <= 109
    • -109 <= target <= 109
    • 只会存在一个有效答案

    Python:

    #暴力解法
    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            n = len(nums)
            for i in range(n):
                for j in range(i + 1, n):
                    if nums[i] + nums[j] == target:
                        return [i, j]
            
            return []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    #哈希表
    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            hashtable = dict()
            for i, num in enumerate(nums):
                if target - num in hashtable:
                    return [hashtable[target - num], i]
                hashtable[nums[i]] = i
            return []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Go:

    //暴力解法
    func twoSum(nums []int, target int) []int {
        for i, x := range nums {
            for j := i + 1; j < len(nums); j++ {
                if x+nums[j] == target {
                    return []int{i, j}
                }
            }
        }
        return nil
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    //哈希表
    func twoSum(nums []int, target int) []int {
        hashTable := map[int]int{}
        for i, x := range nums {
            if p, ok := hashTable[target-x]; ok {
                return []int{p, i}
            }
            hashTable[x] = i
        }
        return nil
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    字母异位词分组

    题目链接

    给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

    字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

    示例 1:

    输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
    输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
    
    • 1
    • 2

    示例 2:

    输入: strs = [""]
    输出: [[""]]
    
    • 1
    • 2

    示例 3:

    输入: strs = ["a"]
    输出: [["a"]]
    
    • 1
    • 2

    提示:

    • 1 <= strs.length <= 104
    • 0 <= strs[i].length <= 100
    • strs[i] 仅包含小写字母

    Python:

    #法一
    class Solution(object):
        def groupAnagrams(self, strs):
            """
            :type strs: List[str]
            :rtype: List[List[str]]
            """
            hash_map = {}
            for i in strs:
                str1 = "".join(sorted(i))
                if str1 in hash_map.keys():
                    hash_map[str1].append(i)
                else:
                    hash_map[str1] = [i]
            return list(hash_map.values())
    
        import collections
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    #法二
    
    import collections
    class Solution(object):
        def groupAnagrams(self, strs):
            """
            :type strs: List[str]
            :rtype: List[List[str]]
            """
            mp = collections.defaultdict(list)
    
            for st in strs:
                key = "".join(sorted(st))
                mp[key].append(st)
            
            return list(mp.values())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Go:

    import (
    	"sort"
    )
    
    func groupAnagrams(strs []string) [][]string {
    	anagramMap := make(map[string][]string)
    	for _, str := range strs {
    		strBytes := []byte(str)
    		sort.Slice(strBytes, func(i, j int) bool {
    			return strBytes[i] < strBytes[j]
    		})
    		sortedStr := string(strBytes)
    		anagramMap[sortedStr] = append(anagramMap[sortedStr], str)
    	}
    	var result [][]string
    	for _, group := range anagramMap {
    		result = append(result, group)
    	}
    	return result
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    最长连续序列

    题目链接

    给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

    请你设计并实现时间复杂度O(n) 的算法解决此问题。

    示例 1:

    输入:nums = [100,4,200,1,3,2]
    输出:4
    解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
    
    • 1
    • 2
    • 3

    示例 2:

    输入:nums = [0,3,7,2,5,8,4,6,0,1]
    输出:9 
    
    • 1
    • 2

    提示:

    • 0 <= nums.length <= 105
    • -109 <= nums[i] <= 109

    Python:

    #本人解法
    import collections
    class Solution:
        def longestConsecutive(self, nums: List[int]) -> int:
            nums.sort()
            mp = collections.defaultdict(int)
            for i in nums:
                if i - 1 in mp:
                    mp[i] = mp[i-1] + 1
                    mp.pop(i - 1)
                elif i not in mp:
                    mp[i] = 1
            if not mp:
                return 0
            return max(mp.values())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    #官方解法
    class Solution:
        def longestConsecutive(self, nums: List[int]) -> int:
            longest_streak = 0
            num_set = set(nums)
    
            for num in num_set:
                if num - 1 not in num_set:
                    current_num = num
                    current_streak = 1
    
                    while current_num + 1 in num_set:
                        current_num += 1
                        current_streak += 1
    
                    longest_streak = max(longest_streak, current_streak)
    
            return longest_streak
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    Go:

    //本人解法
    import (
    	"sort"
    )
    func longestConsecutive(nums []int) int {
    	sort.Ints(nums)
    	mp := make(map[int]int, 0)
    	for _, v := range nums {
    		if _, ok := mp[v-1]; ok {
    			mp[v] = mp[v-1] + 1
    			delete(mp, v-1)
    		} else if _, ok := mp[v]; !ok {
    			mp[v] = 1
    		}
    	}
    	if len(mp) > 0 {
    		max := 0
    		for _, v := range mp {
    			if v > max {
    				max = v
    			}
    		}
    		return max
    	}
    	return 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    //官方解法
    func longestConsecutive(nums []int) int {
        numSet := map[int]bool{}
        for _, num := range nums {
            numSet[num] = true
        }
        longestStreak := 0
        for num := range numSet {
            if !numSet[num-1] {
                currentNum := num
                currentStreak := 1
                for numSet[currentNum+1] {
                    currentNum++
                    currentStreak++
                }
                if longestStreak < currentStreak {
                    longestStreak = currentStreak
                }
            }
        }
        return longestStreak
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    百度飞浆OCR识别表格入门python实践
    Ant-vue-tabel2.x表格合计通用方法
    初识上位机(下):C#读写PLC数据块数据
    vue2+若依框架plus交互 路由介绍
    11.8代码
    mybatis代码自动生成插件
    万行代码计划A,Code Shit Mountain, Enlarging
    华为OD 走方格的方案数(100分)【java】A卷+B卷
    【Vue】06 计算属性 侦听属性
    【华为机试真题 JAVA】小朋友排队-100
  • 原文地址:https://blog.csdn.net/m0_63230155/article/details/132792953