LeetCode 219:Contins Duplicate II
2206 ワード
Gven an array of integers and an integer k,find out whethere there re re re two distinct i and j in the array such that nums[i]=nums[j]and the difference between and j most k.
直接使用循環時間の複雑さはO(N*k)であり、stlにおけるマゼンタによるサイクル時間を減らすことができ、O(logN)の時間複雑度の中で要素を見つけたり、hashテーブルによるunorderd(u)をさらに使うことができる.mapは、定数時間内に要素を見つける.この問題で学んだ二つの経験:定数時間内でクエリー作業を完了したい場合、hashテーブルを考慮する. stlには、hashテーブルで実現されるデータ構造mapとsetがあるので、hashテーブルクエリの特徴も残しています. コードは以下の通りです
直接使用循環時間の複雑さはO(N*k)であり、stlにおけるマゼンタによるサイクル時間を減らすことができ、O(logN)の時間複雑度の中で要素を見つけたり、hashテーブルによるunorderd(u)をさらに使うことができる.mapは、定数時間内に要素を見つける.この問題で学んだ二つの経験:
class Solution {
public:
/* : bool containsNearbyDuplicate(vector<int>& nums, int k) { int length=nums.size(); if(length<=1||k<=0) return false; // k for(int i=0;i<length;i++) { for(int j=1;j<=k&&(i+j)<length;j++) { if(nums[i]==nums[i+j]) return true; } } return false; } */
// , stl map,
bool containsNearbyDuplicate(vector<int>& nums, int k)
{
// map, 96ms, map unordered_map 32ms
unordered_map<int ,int> maps;
int length=nums.size();
for(int i=0;i<length;i++)
{
if(maps.count(nums[i]))// maps , k
{
if((i-maps[nums[i]])<=k)
return true;
}
maps[nums[i]]=i;
}
return false;
}
};