LeetCode热题100之哈希

56 阅读2分钟

将近一年没刷题了,热题100又发生变化了,现在来试试水, 经典第一题还是两数之和 哈哈哈😄

1. 两数之和

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

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

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

示例 1:

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

解答:

fun twoSum(nums: Array<Int>, target: Int): IntArray {
    val array = IntArray(2)
    val map = HashMap<Int, Int>()
    for (i in nums.indices) {
        if (map.containsKey(nums[i])) {
            array[0] = map[nums[i]]!!
            array[1] = i
            return array
        }
        map[target - nums[i]] = i
    }
    return array
}

49. 字母异位词分组

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

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

字母异位词 指字母相同,但排列不同的字符串

示例 1:

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

解答:

fun groupAnagrams(strs: Array<String>): ArrayList<List<String>> {
    val map = HashMap<String, ArrayList<String>>()
    for (s in strs) {
        //字符串中的字符重排序
        val sort = s.toCharArray().sorted().joinToString("")
        if (map[sort] == null) { //利用has特性,初始化字符集合
            map[sort] = ArrayList()
        }
        //利用has特性将当前字符填入到不同集合中
        map[sort]?.add(s)
    }
    val list = ArrayList<List<String>>()
    //便利map表,组装数据
    map.forEach {
        list.add(it.value)
    }
    return list
}

128. 最长连续序列

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

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

 

示例 1:

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

示例 2:

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

解答:

fun longestConsecutive(nums: IntArray): Int {
    val sort = nums.sortedArray()
    val map = HashMap<Int,Int>()
    var max = 0
    var  count = 0
    for (i in sort.indices) {
        map[sort[i]] = sort[i] //利用has去重
        if (i>0) {
            if (map[sort[i - 1]]== sort[i]){ //前后相同元素,不记录+1
                continue
            }
            if (map[sort[i - 1]]!! + 1 == sort[i]) { //前后元素相差1,记录
                count++
            } else {
                //前后元素不同,重新计算
                count = 1
            }
        }else{
            count = 1
        }
        //取上一组连贯数 ,与下一组连贯数的最大值
        max = if(count > max) count else max
    }
    return max
}

ok打完收工😬