Hot100之哈希

发布于:2025-02-10 ⋅ 阅读:(67) ⋅ 点赞:(0)

1两数之和

题目

思路解析

解法1--两次循环

解法2--哈希表一次循环

代码

解法1--两次循环
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int nums1[] = new int[2];
        int length = nums.length;
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length; j++) {
                if (nums[i] + nums[j] == target) {
                    nums1[0] = i;
                    nums1[1] = j;
                    return nums1;
                }
            }
        }
        return nums1;
    }
}
解法2--哈希表一次循环
import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[]{map.get(complement), i};
            }
            map.put(nums[i], i);
        }
        return new int[]{};
    }
}

49字母异位词分组 

题目

思路解析

我们利用一个Map结构Map<String,List>

然后我们把字符串String变成我们的char【】数组,然后Arrays.sort()对字符数组进行排序

将排序后的字符数组变成String放到Map中(这样子就能保证ate,eat,tea的value就是排序后的字符数组aet)

最后通过return new ArrayList(map.values()),将Map中的所有键值对构造成List

代码

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs.length == 0 || strs == null) {
            return new ArrayList();
        }

        Map<String, List> map = new HashMap<String, List>();

        for (String s : strs) {
            // 将字符串转化为字符数组
            char[] chars = s.toCharArray();

            // 对字符数组按照字母顺序排序
            Arrays.sort(chars);

            // 将排序后的字符串作为哈希表中的key值
            String key = String.valueOf(chars);

            // 判断哈希表中是否有该key值
            if (!map.containsKey(key)) {
                // 若不存在,则为新的异位词语,在map中创建新的键值对
                map.put(key, new ArrayList());
            }

            // 将该字符串放在对应key的list中
            map.get(key).add(s);
        }

        // 返回map中所有键值对象构成的list
        return new ArrayList(map.values());
    }
}

 


128最长连续数列

题目

思路解析

我们通过Set结构的contains()来看看是否有连续的变量

我们开始计算的条件是:我们该元素-1不存在,说明这就是连续递增元素的头,我们从这个开始计算

如果我们前面元素存在,说明这个元素不是连续递增元素的头,我们要求最长连续数列,所以没必要计算

        for (int num : set) {
        
            // 说明不会重复,因为1,2,3,4我们已经算完了,我们还从2,3,4算起就没必要了
            // 因为我的最长已经从第一个最小数字开始算出来了
            //所以我们在元素x的时候,如果我们的元素x-1不存在,说明前面没有连续的,我们在x开始遍历
            //如果我们的元素x-1存在,说明它不是连续递增的头,所以没必要遍历
            if (!set.contains(num - 1)) {
                int currentNum = num; // 一个变量用来++
                int currentMax = 1;

                while (set.contains(currentNum + 1)) {
                    currentNum++;
                    currentMax++;
                }

                maxlength = Math.max(maxlength, currentMax);
            }
        }

代码

class Solution {
    public int longestConsecutive(int[] nums) {
        // 利用Set结构,把数字都放到Set结构里面
        Set<Integer> set = new HashSet<Integer>();

        for (int num : nums) {
            set.add(num);
        }

        int maxlength = 0;

        for (int num : set) {
        
            // 说明不会重复,因为1,2,3,4我们已经算完了,我们还从2,3,4算起就没必要了
            // 因为我的最长已经从第一个最小数字开始算出来了
            //所以我们在元素x的时候,如果我们的元素x-1不存在,说明前面没有连续的,我们在x开始遍历
            //如果我们的元素x-1存在,说明它不是连续递增的头,所以没必要遍历
            if (!set.contains(num - 1)) {
                int currentNum = num; // 一个变量用来++
                int currentMax = 1;

                while (set.contains(currentNum + 1)) {
                    currentNum++;
                    currentMax++;
                }

                maxlength = Math.max(maxlength, currentMax);
            }
        }

        return maxlength;
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到