leetcode刷题日记:217. Contains Duplicate(存在重复元素)和219. Contains Duplicate II(存在重复元素 II)

JMeter 压测实战全教程 脚本结构:测试计划 → 线程组 → HTTP 请求 → 监听器运行方式:图形化调试,命令行生产压测核心指标:QPS、RT、错误率、CPU、GC。 阅读详情

217.Contains Duplicate(存在重复元素)

在看到这一个问题的时候我的第一想法是,如果使用双重循环去遍历每一个元素是否存在与之相同的元素不就能将问题解决吗?于是我写出了下面的代码:

bool containsDuplicate(int* nums, int numsSize) {
    for(int i = 0; i< numsSize; i++){
        for(int j = i+1; j<numsSize; j++){
            if(nums[i]==nums[j]){
                return 1;
            }
        }
    }
    return 0;
}

但是这种算法的时间复杂度是O(n2)O(n^2)O(n2)当数组的规模特别大时就会特别耗费时间,所以不出我所料的Time Limit Exceeded了。
既然这种不行,那我们就需要去寻找如何去利用更短的时间去查找相同的元素了,我们想一想我们是不是可以建立一个特别大的数组p,然后元素的值nums[i]作为下标,在数组中使用元素p[nums[i]]来存储nums[i]的出现次数,这样在之后我们就能够先遍历一遍nums[i]找出每一个元素的出现次数,然后遍历数组p产看是否存在出现次数超过1的元素。
上面这种方法在理论上可行,但是因为nums[i]的取值范围是特别大的,如果我们要建立一个这样的数组p,这个数组p就会特别大,显然这种方法的空间效率特别低。
那么我们能不能优化一下数组的存储方式,来让空间效率变得可以接受?我们首先来看一下对于nums中nums[i]元素的取值最多有numsSize种,也就是说我们理论上只需要numsSize个存储单元就能够完成数组p的存储,所以我们现在的主要目标就是将nums种的元素建立一个映射,来使这些元素映射到0 ~ numsSize-1之间,说到这,你有没有想到一种运算可以将元素的值映射到0 ~ numsSize之间,那就是取余运算,所以我们可以先通过取余运算建立一个映射,但是这一种映射会将一些余数相同的数映射到一类中,所以p数组中p[i]中存储的元素表示的是余数为i的元素出现的次数,而不是i这一个元素出现的次数,所以我们还要在p数组中p[i]存储nums中余数为i的元素,这样建立好之后,我们在p中查找出现次数大于1的元素,检查其中元素是否存在相等的情况。
这样我们就能够完成相同元素的判别,而且这种算法在一般情况下时间复杂度为O(n),最坏情况下为O(n²).
算法画出图示为:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
然后检查出现次数大于1的元素的值是否相等,这一步可以在添加元素到p中的时候进行,这时候进行操作就行了,综上我们可以写出代码如下:

struct ListNode1{
    int val;
    int index;
    struct ListtNode1 *next;
};
struct ListNode2{
    int count;
    struct ListNode1 *val;
};
int containsDuplicate(int* nums, int numsSize) {
    struct ListNode2 * p = (struct ListNode2 *)malloc(sizeof(struct ListNode2)*numsSize);
    for(int i = 0; i<numsSize; i++){
        p[i].count = 0;
        p[i].val =NULL;
    }
    for(int i = 0; i<numsSize; i++){
        int x = nums[i]%numsSize;
        if(x<0){
            x+= -1*(x/numsSize-1)*numsSize;
        }
        p[x].count+=1;
        struct ListNode1 *q = (struct ListNode1 *)malloc(sizeof(struct ListNode1));
        q->val = nums[i];
        q->next = NULL;
        if(p[x].val!=NULL){
            struct ListNode1 *s;
            s = p[x].val;
            while(s->next!=NULL){
                if(s->val==q->val){
                    return 1;
                }
                s = s->next;
            }
            if(s->val==q->val){
                    return 1;
            }
            s->next = q;
        }else{
            p[x].val = q;
        }
    }
    return 0;
}

运行结果截图:
在这里插入图片描述

219. Contains Duplicate II(存在重复元素 II)

这一个问题与217. Contains Duplicate(存在重复元素)问题的主要差别在于,此问题需要额外判断一个i-j<=k,将此条件加上就行了,
代码如下:

struct ListNode1{
    int val;
    int index;
    struct ListtNode1 *next;
};
struct ListNode2{
    int count;
    struct ListNode1 *val;
};
int containsNearbyDuplicate(int* nums, int numsSize, int k) {
    struct ListNode2 * p = (struct ListNode2 *)malloc(sizeof(struct ListNode2)*numsSize);
    for(int i = 0; i<numsSize; i++){
        p[i].count = 0;
        p[i].val =NULL;
    }
    for(int i = 0; i<numsSize; i++){
        int x = nums[i]%numsSize;
        if(x<0){
            x+= -1*(x/numsSize-1)*numsSize;
        }
        p[x].count+=1;
        struct ListNode1 *q = (struct ListNode1 *)malloc(sizeof(struct ListNode1));
        q->val = nums[i];
        q->index = i;
        q->next = NULL;
        if(p[x].val!=NULL){
            struct ListNode1 *s;
            s = p[x].val;
            while(s->next!=NULL){
                if(s->val==q->val&&q->index-s->index<=k){
                    return 1;
                }
                s = s->next;
            }
            if(s->val==q->val&&q->index-s->index<=k){
                    return 1;
            }
            s->next = q;
        }else{
            p[x].val = q;
        }
    }
    return 0;
}

运行结果如下:
在这里插入图片描述

2023华为od机试C卷【启动多任务排序】C++ 实现 一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。 阅读详情

相关推荐

AnolisOS网卡驱动源码编译与安装实战指南

本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。

weixin_28358083的博客 307

217. Contains Duplicate(存在重复元素)———附带思路和完整代码

文章目录0 效果1 题目2 思路3 代码 0 效果 1 题目 2 思路 排序后,以此判断两个相邻元素是否相等。 3 代码 int cmp(const void* p1, const void* p2){ return *(int*)p1 - *(int*)p2; } bool containsDuplicate(int* nums, int numsSize){ qsort(nums, numsSize, sizeof(int), cmp); bool ans = false;

韩江雪de 小屋 938

LVGL项目内存告急?试试把中文字库放到SD卡里(基于LvglFontTool V0.5)

本文详细介绍了在LVGL嵌入式项目中如何通过将中文字库存储到SD卡来优化内存使用。针对Flash资源有限的MCU,如STM32F103,提供了基于LvglFontTool V0.5的外部字库生成与动态加载方案,适用于多字号、多语言及OTA场景,显著减少固件体积并提升显示灵活性。

weixin_33726318的博客 457

Contains Duplicate (存在重复元素) - Hash Table (哈希表)

Contains Duplicate (存在重复元素) - Hash Table (哈希表) https://leetcode-cn.com/problems/contains-duplicate/ Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct. 给定一个整数数组,判断是否存在重复元

程永强 1163

trae使用playwright MCP方法流程

trae使用playwright MCP方法流程

MAILLIBIN的专栏 1677

YOLOv11改进策略【独家融合改进】| 模型轻量化二次改进:StarNet + FreqFusion,极限降参,适用专栏内所有轻量化模型

FreqFusion是一种旨在解决密集图像预测任务中特征融合问题。

Limiiiing的博客 2125

Contains Duplicate II

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.E...

zrh_优快云的博客 358

工程级 RK3588 YOLOv5 Android 架构拆解:NPU 量化优化 + 多线程推理 + 跟踪算法源码

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

LXY_LOVE36的博客 130

【力扣算法 LeetCode】217. Contains Duplicate 存在重复元素

文章目录前言一、题目二、解答1.代码2.复盘总结 前言 题目出自力扣 算法练习题:Contains Duplicate 存在重复元素 一、题目 题目 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 题目链接 测试用例 示例 1: 输入:nums = [1,2,3,1] 输出:true 示例 2: 输入:nums = [1,2,3,4] 输出:false 示例 3: 输入:nums = [1,1,1,3,3

南迁的博客 221

使用 Simulink 进行电力电子系统的大信号模型仿真

电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。大信号模型仿真的目的是通过模拟系统在非线性条件下的真实行为,评估其瞬态响应、稳态性能以及对不同负载和输入电压变化的响应。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的大信号模型仿真。背景介绍。

xiaoheshang_123的博客 305

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3237

python leetcode 日记 --Contains Duplicate II --219

题目: Given an array of integers and an integerk, find out whether there are two distinct indicesiandjin the array such thatnums[i] = nums[j]and the difference betweeniandjis at mostk. 给定一个...

weixin_30690833的博客 97

手把手教你学simulink(24.4)--Simulink在机器人视觉场景下的应用——基于视觉的物体跟踪与抓取

该系统集成了图像处理、目标检测、运动估计、路径规划、抓取控制和视觉反馈等多个功能模块,能够实现实时处理视觉数据、检测并跟踪移动物体、规划最优路径并控制机械臂进行精确抓取。本项目的目标是使用Simulink和MATLAB设计一个基于视觉的物体跟踪与抓取系统,该系统能够实时处理图像数据,检测并跟踪移动物体,规划最优的抓取路径,并控制机械臂进行精确抓取。为了验证系统的性能,我们在Simulink中搭建了基于视觉的物体跟踪与抓取系统的仿真模型。

MHD0815的博客 258

Contains Duplicate

判断一个数组中是否含有重复的数字。

不积跬步无以至千里 619

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

219. Contains Duplicate II

Given an array of integers and an integerk, find out whether there are two distinct indicesiandjin the array such thatnums[i] = nums[j]and theabsolutedifference betweeniandjis at most...

weixin_30307267的博客 149

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

219. Contains Duplicate II [easy] (Python)

题目链接https://leetcode.com/problems/contains-duplicate-ii/题目原文 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

Coder_Orz的博客 4155

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

leetcode 219: Contains Duplicate II

leetcode 219: Contains Duplicate II java c++ python

西施豆腐渣 9426

Contains Duplicate 包含重复

217. Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should retur

知之可否 1220

LeetCode Contains Duplicate II

LeetCode Contains Duplicate II题目思路跟Contains Duplicate一模一样,加个坐标判断即可。代码bool containsNearbyDuplicate(int* nums, int numsSize, int k) { if (numsSize <= 1) return false; int length = 100007; if

Nightonke's Blog 1429

217. Contains Duplicate

Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element

Bryan要加油 740
上一篇: leetcode刷题日记:205. Isomorphic Strings(同构字符串)
下一篇: 计算机图形学:直线的扫描转换算法解析与实现
apprentice_eye
博客等级 码龄6年 1165粉丝 348原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值