LeetCode219

219. 存在重复元素 II

 


给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k

示例 1:

输入: nums = [1,2,3,1], k = 3
输出: true

示例 2:

输入: nums = [1,0,1,1], k = 1
输出: true

示例 3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

 

这道题意思好像是让用hash来做

 

解法1:我想的这个方法很蛋疼,1830ms。。。强行ac的

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
		for(int i=0;i<nums.size();i++){
			for(int j=i+1;j<=i+k;j++)
			{
				if(j>=nums.size()) break;
				if(nums[i]==nums[j])	
				     return true;
			}
		}
		return false;
    }
};




int main(){
	int n,m,k;
	vector<int> nums;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>m;
		nums.push_back(m);
	}
	cin>>k;
	Solution solution;
	cout<<solution.containsNearbyDuplicate(nums,k)<<endl;

	system("pause");
}

 

解法2:hash,以索引作为value,对应的值作为key,然后通过hash去做,需要注意的是如果出现相同的值,但是索引差比k大,就把索引更新。

 

​
#include<iostream>
#include<vector>
#include <string>
#include<unordered_map>
using namespace std;

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
		if(nums.size()==0 || k<=0) return false; 
		unordered_map<int ,int> res;

		for(int i=0;i<nums.size();i++){
		if(res.find(nums[i])==res.end())  //如果找到相同的value,更新key    
			res[nums[i]]=i;    
		//	res.insert({ nums[i],i});     //在vs中,这样插入会出现问题
		else
		{
			if(i-res[nums[i]]<=k)
				return true;
			else
			    res[nums[i]]=i;

		}
	}
		return false;
	}

};

int main(){
	int n,m,k;
	vector<int> nums;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>m;
		nums.push_back(m);
	}
	cin>>k;
	Solution solution;
	cout<<solution.containsNearbyDuplicate(nums,k)<<endl;

	system("pause");
}

​

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值