一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・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.テスト結果
全体として、3つの方法は類似しており、比較する必要がある場合は、3番目の方法の方が適しています。