力扣697/java/哈希表解法

给定一个非空整数数组nums,数组的度定义为最大元素出现的次数。该程序使用哈希表来跟踪每个元素的出现次数和位置,然后找到具有相同度的最短连续子数组,返回其长度。通过遍历哈希表,更新最大次数和最短长度,最终得到答案。

题目:

给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

哈希表解法:

class Solution {
    public int findShortestSubArray(int[] nums) {
        Map<Integer, int[]> map = new HashMap<Integer, int[]>();
        int n = nums.length;
        for (int i = 0; i < n; i++) {
                //如果哈希表包含这个数字就次数加一
            if (map.containsKey(nums[i])){
                //这个重复数字在哈希表中对应的value数组要次数加一和记录位置
                map.get(nums[i])[0]++;
                map.get(nums[i])[2] = i;
            } else {
                //没有出现在哈希表中的数字就记录进哈希表,
                //结构为map(key为不重复数字:value为数组[次数,第一次出现索引位置,最后一次出现索引位置])
                map.put(nums[i], new int[]{1, i, i});
            }
        }
        int maxNum = 0, minLen = 0;
        //遍历从哈希表取出来的value数组
        for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
            int[] arr = entry.getValue();
            //maxNum存储数字出现的最多次数
            //minLen存储第一次出现位置到最后一次出现位置的长度
            if (maxNum < arr[0]) {
                maxNum = arr[0];
                minLen = arr[2] - arr[1] + 1;
            } else if (maxNum == arr[0]) {
                if (minLen > arr[2] - arr[1] + 1) {
                    minLen = arr[2] - arr[1] + 1;
                }
            }
        }
        return minLen;
    }
}
### 关于LeetCode中的Java问题及其解决方案 在处理LeetCode上的Java编程问题时,可以参考多个资源来获取高质量的解答和思路。以下是关于如何查找与LeetCode相关的Java编程问题以及它们的解决方案的一些详细说明。 #### 资源汇总 1. **Python & JAVA Solutions for LeetCode** 这一资源提供了针对LeetCode上许多经典算法问题的Java实现方案[^1]。它涵盖了多种类型的题目,包括但不限于数组、链表、字符串、动态规划等领域的问题解决方。 2. **LeetCode-Solutions** 此项目不仅包含了Python版本的解,还提供了一些现代C++风格的代码示例,但对于寻找Java版答案的需求者来说同样适用,因为部分逻辑可以直接移植到Java环境中[^2]。虽然主要面向另一种语言开发人员,但它仍然能够帮助理解底层原理并转换成相应的Java形式。 3. **LintCode: Java Solutions** 针对某些特定类别如哈希表(Hash Table),滑动窗口(Sliding Window),字符串(Strings)等问题有专门讨论,并给出了详细的Java实现案例[^3]。这些分类有助于快速定位自己感兴趣的专题练习方向。 4. **Leetcode-146 LRU缓存(java中封装好的)** 对象设计型问题是面试常考知识点之一,在这里我们可以看到有关LRU Cache的具体实现细节描述及其实现过程分析[^4]。通过研究此类复杂结构的设计模式可以帮助提升整体编码能力水平。 #### 示例代码展示 下面给出一个简单的例子——反转二叉树(Binary Tree Invertion) 的Java 实现: ```java public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } } class Solution { public TreeNode invertTree(TreeNode root) { if(root == null){ return null; }else{ //交换左右子节点 TreeNode tempNode = root.left; root.left = invertTree(root.right); root.right = invertTree(tempNode); return root; } } } ``` 此段程序展示了递归调用的方式完成整个二叉树镜像翻转的过程. #### 总结建议 对于希望深入学习LeetCode平台上各类挑战性较高的计算机科学基础概念并通过实践加以巩固的学习者而言,上述提到的各种开源资料都是非常宝贵的知识宝库。合理利用他们不仅可以提高个人解决问题的能力还可以积累宝贵的实战经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值