如何利用C++、Java、Python在一个数组的范围k内查找重复的内容

116 阅读1分钟

问题

给你一个整数数组和一个数字 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