アルゴリズムは毎日の練習に質問します---77日目:重複する要素があります

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して12日目です。クリックしてイベントの詳細をご覧ください

1.問題の説明

整数の配列を提供します nums 。いずれかの値が配列 に少なくとも2回true出現する場合に戻ります。 配列内の各要素が異なる場合に  、戻ります false 。

トピックリンク:重複する要素があります

第二に、主題の要件

例1

输入: nums = [1,2,3,1]
输出: true
复制代码

例2

输入: nums = [1,2,3,4]
输出: false
复制代码

訪問

1.哈希表、排序、判重
2.建议用时10~25min
复制代码

3.問題分析

この質問は、主に繰り返される要素を判断するという考えを調べるために、比較的簡単です。最初はダブルforループで判断しないでください。タイムアウトになります。

いくつかの選択肢があります:づ ̄3 ̄)づ

1.ハッシュカウント

最初に配列要素をループし、ハッシュテーブルを使用して各数値の出現回数を格納します。格納中に数値が出現した場合はtrueを返し、そうでない場合は最後にfalseを返します。

2.ストレージを設定します

セットには、保存されている重複要素が自動的にスキップされ、保存されないという機能があります。

したがって、要素が繰り返される配列を設定すると、長さは確実に短くなります。

3.仕分け判断

重複する要素を並べ替える方法は?

まず、サンプル1を例にとると、ソートされた結果は次のようになります。

1 1 2 3
复制代码

最初の数値は、2番目の数値から始めて判断する必要はありません。前の数値と同じ場合はtrueを返し、そうでない場合はtrueを返します。

第四に、エンコーディングの実装

1.ハッシュカウント

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        int i,n=nums.size();//初始化
        map<int,int>m;//哈希计数
        for(i=0;i<n;i++)
        {
            m[nums[i]]++;//计数
            if(m[nums[i]]>=2)//条件判断
                return true;
        }
        return false;
    }
};
复制代码

2.ストレージを設定します

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        int i,n=nums.size();//初始化
        set<int>s;//set存储
        for(i=0;i<n;i++)
            s.insert(nums[i]);//插入
        if(s.size()<n)//发现数组长度变小,存在重复元素
            return true;
        else    
            return false;
    }
};

复制代码

3.仕分け判断

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        int i,n=nums.size();//初始化
        sort(nums.begin(),nums.end());//排序
        for(i=1;i<n;i++)
            if(nums[i]==nums[i-1])//判重
                return true;
        return false;
    }
};
复制代码

5.テスト結果

1.png

2.png

3.png

全体として、3つの方法は類似しており、比較する必要がある場合は、3番目の方法の方が適しています。

おすすめ

転載: juejin.im/post/7085502678817734686