Java教程

【每日算法】存在重复元素 II

本文主要是介绍【每日算法】存在重复元素 II,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

题目描述


这是 LeetCode 上的 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

分析题目要求

1、找出是否存在,返回true和false即可
2、找出两个不同的索引 i 和 j
3、i和j 满足nums[i]=nums[j]
4、|i-j|<=k

看到数组,要找相同的两个数首先想到的应该是双指针的解法,思路如下

1、定义两个指针left,right
2、left先不动,移动right,使用nums[left]=nums[right]
3、如果|left-right|<=k,那么就找存在,就直接返回
4、如果不满足,则继续移动left、right
5、如果找不到则返回false
总结:两层循环,外层控制left,内层控制right

两层循环,感觉应该不会有多快,时间复杂度有O(n*n)
先代码实现试试

def containsNearbyDuplicate(self, nums, k):
    n=len(nums)
    for left in range(n-1):
        for right in range(left+1,n):
            if nums[left]==nums[right] and abs(left-right)<=k:
                return True
    return False

果不其然,直接超时,AC不了

用一个hash用记录每个元素的索引,如果下个值存在hash中,用hash的值与当前索引求差,看是否满足条件

def containsNearbyDuplicate(self, nums, k):
    tmp={}
    for i in range(len(nums)):
        if nums[i] in tmp and i-tmp[nums[i]]<=k:
            return True
        tmp[nums[i]]=i
    return False

这篇关于【每日算法】存在重复元素 II的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!