力扣(leetcode)[697. 数组的度]我是菜菜之借鉴别人思路,不过非常简单,容易理解的方法,过来看看吧

> Problem: [697. 数组的度]

都是用java代码实现的,从明天开始,同时用java代码和python代码双实现!

最近这几天有事情没更新,加油!最近更新的都是关于数组中统计数组中的元素方面的题,加油!!

# 思路

> 思路嘛,第一次看待这个题的时候我是比较懵逼的,我知道要去计算每个数字出现的次数,但是我不能用这个思路去解决出现的次数相同的话,比较两者之间的最小值,看官方的解题思路我也不能很好的去解决这个问题,于是我在后面看到了这位大神的解题思路,我才发现如此的简单,说上来我挺菜的,加油!

# 解题方法

> 简简单单的解题方法,首先定义三个数组大小必须比 nums[i]大,因为接下来的数组一个记录该数字出现的次数(countArr),一个记录该数字第一次出现的位置*(leftArr),一个记录该数字最后出现的位置(rightArr),在这三个数组中,下标均为nums[i]作为下标,方便计算,所以,我在此设置的数组长度为50009,其实50001就可以,习惯性设置这样子(nums[i] 是一个在 0 到 49,999 范围内的整数。),

后面那个for循环则循环countArr中的数,就很容易理解了,多看看就明白了,不明白可以在评论区里面问问!

# Code

```Java []

class Solution {

    public int findShortestSubArray(int[] nums) {

        int[] leftArr = new int[50009];

        int[] rightArr = new int[50009];

        int[] countArr = new int[50009];

        Arrays.fill(leftArr,-1);

        for (int i = 0; i < nums.length; i++) {

            countArr[nums[i]]++;

            if (leftArr[nums[i]] == -1) {

                leftArr[nums[i]] = i;

                rightArr[nums[i]] = i;

            } else {

                rightArr[nums[i]] = i;

            }

        }

        int min = 50009;

        int count = 0;   //记录该数字出现的次数

        for (int i = 0; i < 50009; i++) {

            int x = countArr[i];  //该数字出现的次数

            if (x == count) {

                min = Math.min(min, rightArr[i] - leftArr[i] + 1);

            } else if (x > count) {

                min = rightArr[i] - leftArr[i] + 1;

                count = x;

            }

        }

        return min;

    }

}

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值