leetcode 219. 存在重复元素 II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 ij ,满足 nums[i] == nums[j]abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false

示例 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 <= nums.length <= 10e5
  • -109 <= nums[i] <= 10e9
  • 0 <= k <= 10e5

分析:其实这道题最直接的还是哈希。因为总数据量只有10的5次方,但是毕竟是排序这节的内容,所以还使用排序做了。注意排序除了值的大小,还有下标也要排序。

cpp 复制代码
typedef struct num{
    int value,index;
}num;

int cmp(const void *a,const void *b)
{
    num *aa=(num*)a;
    num *bb=(num*)b;
    if(aa->value!=bb->value)return aa->value-bb->value;
    return aa->index-bb->index;
}
bool containsNearbyDuplicate(int* nums, int numsSize, int k) {
    //if(k==1)return 0;
    num ans[numsSize+5];
    for(int i=0;i<numsSize;++i)
        ans[i].value=nums[i],ans[i].index=i;
    
    qsort(ans,numsSize,sizeof(ans[0]),cmp);
    int value=ans[0].value,index=ans[0].index;
    for(int i=1;i<numsSize;++i)
    {
        if(ans[i].value==value)
        {
            if(ans[i].index-index<=k)return 1;
            else index=ans[i].index;
        }
        else value=ans[i].value,index=ans[i].index;
    }
    return 0;
}
相关推荐
luckycoding2 小时前
1424. 对角线遍历 II
算法·leetcode·职场和发展
刃神太酷啦2 小时前
Linux 常用指令全解析:从基础操作到系统管理(1w字精简版)----《Hello Linux!》(2)
linux·运维·服务器·c语言·c++·算法·leetcode
努力找工作的OMArmy3 小时前
力扣498 对角线遍历
算法·leetcode·职场和发展
德先生&赛先生14 小时前
LeetCode-542. 01 矩阵
算法·leetcode·矩阵
小欣加油18 小时前
leetcode 1493 删掉一个元素以后全为1的最长子数组
c++·算法·leetcode
YuTaoShao1 天前
【LeetCode 热题 100】152. 乘积最大子数组——(解法一)递推
java·算法·leetcode·职场和发展
尘世闲鱼1 天前
移动零【三种思路】
c++·leetcode
flashlight_hi2 天前
LeetCode 分类刷题:2529. 正整数和负整数的最大计数
python·算法·leetcode
野犬寒鸦2 天前
力扣hot100:搜索二维矩阵与在排序数组中查找元素的第一个和最后一个位置(74,34)
java·数据结构·算法·leetcode·list
Keying,,,,2 天前
力扣hot100 | 图论 | 200. 岛屿数量、994. 腐烂的橘子、207. 课程表、208. 实现 Trie (前缀树)
算法·leetcode·图论