Leetcode_Ex1: 重复数问题

本文介绍了解决LeetCode上一道经典算法题目——查找数组中是否存在绝对距离不超过k的相同元素的方法。提供了两种解法:一是利用字典存储元素及其索引,并检查同一元素不同索引之间的距离;二是遍历过程中动态更新字典,快速判断并返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题描述

Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k.

Input: nums = [1,2,3,1], k = 3
Output: true
Input: nums = [1,0,1,1], k = 1
Output: true
Input: nums = [1,2,3,1,2,3], k = 2
Output: false

给定一个整数数组nums和一个整数k,是否存在ij使得nums[i]=nums[j],并且ij的差值小于等于k

2. 解法1

  • 第一步:构造字典,其中key为数组中的值,value为该值对应的id列表;
reverse_nums = {}
for i in range(len(nums)):
	if nums[i] in reverse_nums:
		reverse_nums[nums[i]].append(i)
	else:
		reverse_nums[nums[i]] = [i]
  • 第二步:针对存在重复值的数组元素,计算元素id间的最小差值,如果小于等于则直接返回True
for key in reverse_nums:
	if len(reverse_nums[key]) > 1:
		locas = reverse_nums[key]
        for i in range(len(locas)-1):
        	diff = locas[i+1] - locas[i]
            if diff <= k:
            	return True

上述代码中locas = reverse_nums[key]为取出相应元素的id列表,由于id列表为有序递增列表,所以最小差值必存在于相邻量id之间,当遍历得到的diff小于等于k时,即可返回True。
完整代码如下:

class Solution(object):
    def containsNearbyDuplicate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        flag = 0
        reverse_nums = {}
        for i in range(len(nums)):
            if nums[i] in reverse_nums:
                reverse_nums[nums[i]].append(i)
            else:
                reverse_nums[nums[i]] = [i]
                
        for key in reverse_nums:
            if len(reverse_nums[key]) > 1:
                locas = reverse_nums[key]
                min_diff = len(nums)
                for i in range(len(locas)-1):
                    diff = locas[i+1] - locas[i]
                    if diff <= k:
                        return True
        return False

3. 解法2

在解法1中,我们看到由于在遍历数组时是顺序遍历,且最小差值存在于最相邻的重复元素中,因此在第一步构造字典时,我们无须保存id列表,只要迭代的计算差值即可,所以代码可以修改为如下:

class Solution(object):
    def containsNearbyDuplicate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        if len(nums) == len(set(nums)):
            return False
        dict_nums = {}
        for i in range(len(nums)):
            value = nums[i]
            if value in dict_nums and i - dict_nums[value] <= k:
                return True
            dict_nums[value] = i
        return False

其中dict_nums字典存放的key是数组元素,value是其对应id,因此遍历到当前的i时,如果nums[i]已经存在于数组中,则表明存在一个重复元素,如果i与dict_nums[value]的差值小于等于k,即表明满足了题中条件,返回True。

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值