问题
给你一个整数数组和一个数字 k, 你需要检查 数组中 k 的距离内是否存在重复的 数字。
输入样本
[1, 2, 1, 3]
输出样本
True
方法
我们可以把一个元素的值作为键,把它的索引作为值存储在一个地图中。如果我们遇到一个有重复的元素,而且任何一个重复的元素都在数组的范围内 k 的范围内,我们就在给定的范围内找到重复的元素。这种方法的时间复杂度是O(N),由于创建了一个地图,空间复杂度也是O(N)。
C++编程
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
bool solve(vector<int> &arr, int k)
{
unordered_map<int, int> mp;
for (int i = 0; i < arr.size(); i++)
{
if (mp.find(arr[i]) != mp.end())
{
if (i - mp[arr[i]] <= k) {
return true;
}
}
mp[arr[i]] = i;
}
return false;
}
int main()
{
vector<int> arr = { 1, 2, 1, 3 };
int k = 2;
if (solve(arr, k)) {
cout << "True";
}
else {
cout << "False";
}
return 0;
}
输出
True
Python编程
def solve(arr, k):
mp = {}
for i, element in enumerate(arr):
if element in mp:
if i - mp.get(element) <= k:
return True
mp[element] = i
return False
arr = [1, 2, 1, 3]
k = 2
if solve(arr, k):
print("True")
else:
print("False")
输出
True
Java编程
import java.util.HashMap;
import java.util.Map;
class Main
{
public static boolean solve(int[] arr, int k)
{
Map<Integer, Integer> mp = new HashMap<>();
for (int i = 0; i < arr.length; i++)
{
if (mp.containsKey(arr[i]))
{
if (i - mp.get(arr[i]) <= k) {
return true;
}
}
mp.put(arr[i], i);
}
return false;
}
public static void main(String[] args)
{
int[] arr = {1, 2, 1, 3 };
int k = 2;
if (solve(arr, k)) {
System.out.println("True");
}
else {
System.out.println("False");
}
}
}
输出
True