LeetcCode #220 Contains Duplicate III

2024-05-06 17:48

本文主要是介绍LeetcCode #220 Contains Duplicate III,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] andnums[j] is at mostt and the difference betweeni andj is at mostk.

        本题的Tags是BST,可写BST有点麻烦,其实比较简单的一个思路是,可以定义一个结构体,分别保存nums中元素的值val和下标index,然后对此结构体构成的数组根据val的大小排序,这样就很方便地同时计算  k  值和 t  值了。

       实际上用C++写时,vector中元素的地址值本身就可以作下标用,所以也就没必要再去定义这个结构体了。由此,第一次写好的代码如下:

bool cmp_ptr(int *a, int *b){return *a < *b;
}class Solution {
public:bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {const int n = nums.size();if(n <= 1 || k == 0) return false;vector<int*> num_ptrs(n);for(int i = 0; i < n; i++)  num_ptrs[i] = &nums[i];sort(num_ptrs.begin(), num_ptrs.end(), cmp_ptr);for(int i = 0; i < n; i++){for(int j = i + 1; j < n; j++){if(*num_ptrs[j] - *num_ptrs[i] > t) break;                    //the difference between nums[i] and nums[j] is at most tif(abs(num_ptrs[j] - num_ptrs[i]) <= k) return true;          //the difference between i and j is at most k}}return false;}
};


       本地测试没问题后,提交上去,又来了一个在最后一个case上WA!



      不过WA的这个case给了我充足的提示:

              显然是*num_ptrs[j] - *num_ptrs[i] > t 这个判断条件 在INT_MAX - (-1)时溢出了。

       还好leetcode在WA时都给出出错的测试用列,不然根本不可能找到自己代码是在哪个地方死的。

修改后的代码如下,时间是20ms。

bool cmp_ptr(int *a, int *b){return *a < *b;
}class Solution {
public:bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {const int n = nums.size();if(n <= 1 || k == 0) return false;vector<int*> num_ptrs(n);for(int i = 0; i < n; i++)  num_ptrs[i] = &nums[i];sort(num_ptrs.begin(), num_ptrs.end(), cmp_ptr);for(int i = 0; i < n; i++){for(int j = i + 1; j < n; j++){if(*num_ptrs[j] > *num_ptrs[i] + t) break;                    //the difference between nums[i] and nums[j] is at most tif(abs(num_ptrs[j] - num_ptrs[i]) <= k) return true;          //the difference between i and j is at most k}}return false;}
};

另外在Discuss里发现有人用set做了个滑窗,这个思路也挺好,代码量要少很多。不过相对于上一个方法,效率要低些,AC的时间是48ms。

class Solution {public:bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {set<int> window; // set is ordered automatically for (int i = 0; i < nums.size(); i++) {if (i > k) window.erase(nums[i-k-1]); // keep the set contains nums i j at most k// -t <= x - nums[i] <= t;auto pos = window.lower_bound(nums[i] - t); // x >= nums[i] - tif (pos != window.end() && *pos - nums[i] <= t) // x <= nums[i] + treturn true;window.insert(nums[i]);}return false;}
};


这篇关于LeetcCode #220 Contains Duplicate III的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964949

相关文章

HDU 2064 汉诺塔III(水题)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目大意: 有三根杆,求把n个圆盘从左边移到右边,最少需要移动圆盘的次数。移动规则为大盘不能放在小盘上,比原始的汉诺塔题改变的地方是,只能通过中间的杆往左右两边的杆移动。 心得: 此题心得在题外,不在题内,初看此题,尼玛吓了一跳,好像很难的样子,手贱百度了一下,只注意到俩字“水题”,赶紧

基于STM32设计的水闸水文测控系统(华为云IOT)(220)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成 1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路 1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要 【5】项目背景1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 系统框架图1.6 系统功能总结1.7 设备原理图1.8 硬件实物图 二、硬件

duplicate symbol _OBJC_IVAR

今天该死的SVN又TMD出问题,update之后出现了下面这种问题: duplicate symbol _OBJC_IVAR_$_BDConversationCell._userNameLabel in: 某路径 该错误是一种链接错误,令人头疼的是Xcode不会直接定位到问题具体位置。 但其仍有一定的规律,大概是以下原因:   1.检查是否误导入了问题中类的 .m 文件; 报错:

【正则表达】同时包含2个甚至多个关键字 content.contains(keyword1)content.contains(keyword2)

有三个字符串如何匹配同时包含两个关键字的字符串 str1 = "this is the first check run" str2 = "the first run" str3 = "the first time runing" 有两个关键字(“first ”、”check “) 正则表达式怎么写 然后匹配到str1 // regExp (?=.*我是谁)(?=.*C)^.*

推荐适合中秋的SVG模版(第III期)

宝藏模版 往期推荐(点击阅读): 趣味效果|高大上|可爱风|年终总结I|年终总结II|循环特效|情人节I|情人节II|妇女节|儿童节I|儿童节II|儿童节III|618I|618II|父亲节|丝滑动画|端午节I|端午节II|滑动妙用|图片轮播I|图片轮播II|又红又专|中秋节I|中秋节II|双十一I|双十一II|世界杯|圣诞节|新年|兔年春节|元宵节|愚人节|杂志范儿|520/521I|520

day-47 最大连续1的个数 III

思路 滑动窗口:如果用left和right表示连续1的左右边界,那么意味着可以把0修改为1的次数为k次 解题过程 用一个变量num记录left和right之间0的个数,当num<=k时,right++,num>k时,将left向右移动,直到不再满足num>k Code class Solution {public int longestOnes(int[] nums, int k) {in

[M滑动窗口] lc1004. 最大连续1的个数 III(滑动窗口+模板题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:1004. 最大连续1的个数 III 题单: 滑动窗口(定长/不定长/多指针) 二、不定长滑动窗口 §2.1 求最长/最大 2. 题目解析 思路: 比较直接的滑动窗口哈,好像也没什么需要注意的点。 前缀和+二分 也不是不能做。官解也提到了这个点。但对于本题来讲,看到就是滑窗,没毛病吧。 时间复

力扣2402.会议室 III

力扣2402.会议室 III 双堆模拟 一个堆存未占用的会议室编号一个堆存已占用的结束时间和编号 class Solution {public:int mostBooked(int n, vector<vector<int>>& meetings) {int cnt[n];memset(cnt,0,sizeof(cnt));priority_queue<int,vector<int>,g

maven编译:Found duplicate... 问题的解决

1. 问题描述 一些开源的Java项目对依赖有着很严格的要求,会在root模块的pom.xml文件中,使用各种maven plugin检查依赖是否规范 apache的maven-dependency-plugin:可以检查是否存在unused dependency、used但未explicitly import的dependency等org.basepom.maven的duplicate-fin

_csv.Error: line contains NULL byte

_csv.Error: line contains NULL byte 原因是表格保存时扩展名为 xls,而我们将其改为csv文件通常是重命名; 解决方法只需把它另存为 csv 文件。 posted @ 2017-12-19 16:53 酸奶加绿茶 阅读( ...) 评论( ...) 编辑 收藏