LeetCode-697。配列の次数[単純]-分析とコード(Java)

LeetCode——697。配列の次数[配列の次数] [単純]-分析とコード[Java]

1.トピック

負でない数のみを含む空でない整数配列numsが与えられた場合、配列の次数は、指数グループ内の任意の要素の最大値として定義されます。
あなたの仕事は、numsと同じ次数のnumsで最も短い連続したサブ配列を見つけ、その長さを返すことです。

例1:

输入:[1, 2, 2, 3, 1]
输出:2
解释:
输入数组的度是2,因为元素1和2的出现频数最大,均为2.
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组[2, 2]的长度为2,所以返回2.

例2:

输入:[1,2,2,3,1,4,2]
输出:6

促す:

  • nums.lengthは1から50,000の範囲です。
  • nums [i]は、0から49,999の範囲の整数です。

出典:LeetCode
リンク:https://leetcode-cn.com/problems/degree-of-an-array
著作権はLeetCodeが所有しています商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。

2、分析とコード

1.ハッシュテーブル

(1)考える

3つのハッシュ配列を設計して、各番号の出現回数、最初の出現の位置、および最後の出現の位置を記録します。
各数の出現回数をトラバースして最大次数を取得し、次数に対応する数の連続サブ配列の長さを計算します。最小値が解です。

(2)コード

class Solution {
    
    
    public int findShortestSubArray(int[] nums) {
    
    
        int n = nums.length, size = 50000;
        int[] time = new int[size], first = new int[size], last = new int[size];
        Arrays.fill(time, 0);
        for (int i = 0; i < n; i++) {
    
    //记入哈希表
            if (time[nums[i]]++ == 0)
                first[nums[i]] = i;
            last[nums[i]] = i;
        }
        //寻找最大度数的最短子数组长度
        int maxTime = 0, ans = Integer.MAX_VALUE;
        for (int t : time)
            maxTime = Math.max(maxTime, t);
        for (int i = 0; i < size; i++) {
    
    
            if (time[i] == maxTime)
                ans = Math.min(ans, last[i] - first[i] + 1);
        }
        return ans;
    }
}

(3)結果

実行時間:16ミリ秒、
すべてのJava送信でユーザーの86.49%を上回っています。メモリ消費量:42.9 MB、すべてのJava送信でユーザーの30.94%を上回っています。

3、その他

何もありません。

おすすめ

転載: blog.csdn.net/zml66666/article/details/114108111