LeetCode算法题-Contains Duplicate II(Java实现)
这是悦乐书的第193次更新,第197篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第53题(顺位题号是219)。给定整数数组和整数k,找出数组中是否存在两个不同的索引i和j,使得nums [i] = nums [j]并且i和j之间的绝对差值小于等于k。例如:
输入:nums = [1,2,3,1],k = 3
输出:true
输入:nums = [1,0,1,1],k = 1
输出:true
输入:nums = [1,2,3,1,2,3],k = 2
输出:false
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
利用hashMap,依次遍历数组元素,如果当前元素不存在就put进map,如果存在,则说明具有重复元素,然后获取当前索引与此元素在map中的索引value值的绝对值,判断其是否小于等于k,如果满足,则返回true。
此解法因为用到了map.containsKey()方法,所以时间复杂度最好的情况是O(n),最坏的情况是O(n^2),空间复杂度是O(n)。
public boolean containsNearbyDuplicate(int[] nums, int k) {
if (nums == null || nums.length <= 1) {
return false;
}
HashMap<Integer, Integer> map = new HashMap<>();
for (int i=0; i<nums.length; i++) {
if (map.containsKey(nums[i]) && Math.abs(i-map.get(nums[i])) <= k) {
return true;
} else {
map.put(nums[i], i);
}
}
return false;
}
03 第二种解法
如果满足题目的条件,nums[i] = nums[j],并且j-i <= k,那么只要nums[i]等于nums[i+1]至nums[i+k]之间的任意一个,即可返回true。使用两层for循环,外层控制从1到k,内层遍历数组元素,如果外层指针加上内层指针小于数组大小,并且两指针对应的元素相等,则返回true。
此解法的时间复杂度是O(k*n),最好的情况是O(n),最坏的情况是O(n^2),空间复杂度是O(1)。此解法会超时。
public boolean containsNearbyDuplicate2(int[] nums, int k) {
if (nums == null || nums.length <= 1) {
return false;
}
for (int i=1; i<= k; i++) {
for (int j=0; j<nums.length; j++) {
if (j+i < nums.length && nums[j] == nums[j+i]) {
return true;
}
}
}
return false;
}
04 第三种解法
此解法与上面第二种解法的思路一致,不过是将内外层循环换了位置,并且内层循环判断nums[i]和nums[j]相等时,对于指针的范围做了调整,从数组长度、i+1+k之间取最小值。
public boolean containsNearbyDuplicate3(int[] nums, int k) {
if (nums == null || nums.length <= 1) {
return false;
}
for (int i=0;i < nums.length; i++) {
for (int j=i+1; j<Math.min(nums.length, i+1+k); j++) {
if (nums[i] == nums[j]) {
return true;
}
}
}
return false;
}
05 第四种解法
利用HashSet。此解法的代码和昨天的那道题没多大区别,只不过是在循环判断true或false的前面,加多了一个判断,如果当前的指针i大于k,那么就将HashSet中的nums[i - k - 1]元素删除,即当i>k的时候,将HashSet从第1一个元素开始移除,表示前k个元素已经不符合题目的条件了,并且随着循环继续,会依次删除不符合的元素。
public boolean containsNearbyDuplicate4(int[] nums, int k) {
if (nums == null || nums.length <= 1) {
return false;
}
Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < nums.length; i++) {
if (i > k) {
set.remove(nums[i - k - 1]);
}
if (!set.add(nums[i])) {
return true;
}
}
return false;
}
06 第五种解法
使用双指针。循环内判断true或false的地方,如果两指针不相等,并且其各自所指向的元素相等,则返回true。第二个判断是移动两个指针的关键,两个指针初始值都是0,如果两指针的差小于k,则其中做一个指针加1,否则另外一个指针加1,即判断相隔小于k位之间的元素是否相等。
public boolean containsNearbyDuplicate5(int[] nums, int k) {
if (nums == null || nums.length <= 1 || k == 0) {
return false;
}
int p1 = 0;
int p2 = 0;
while (p1 < nums.length) {
if (nums[p1] == nums[p2] && p1 != p2) {
return true;
}
if (p2 - p1 < k && p2 < nums.length - 1) {
p2++;
} else {
p1++;
}
}
return false;
}
07 小结
算法专题目前已连续日更超过一个月,算法题文章53+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Contains Duplicate II(Java实现)的更多相关文章
- LeetCode算法题-Contains Duplicate(Java实现)
这是悦乐书的第192次更新,第196篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第52题(顺位题号是217).给定一个整数数组,查找数组是否包含任何重复项.如果数组中至 ...
- LeetCode算法题-Valid Palindrome II(Java实现)
这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...
- LeetCode算法题-Range Addition II(Java实现)
这是悦乐书的第271次更新,第285篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第138题(顺位题号是598).给定一个m行n列的新二维数组M,其初始值为0.提供一个二 ...
- LeetCode算法题-Reverse String II(Java实现)
这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
- LeetCode算法题-Flood Fill(Java实现)
这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...
- LeetCode算法题-Image Smoother(Java实现)
这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...
随机推荐
- Go基础系列:Go中的方法
Go方法简介 Go中的struct结构类似于面向对象中的类.面向对象中,除了成员变量还有方法. Go中也有方法,它是一种特殊的函数,定义于struct之上(与struct关联.绑定),被称为struc ...
- 第一册:lesson nineteen。
原文:tired and thirsty. A:What's the matter,children? B:We are tired and thirsty. A:Sit down,here. Are ...
- C# 可访问性不一致问题(修改成员的访问修饰符)。
错误实例一:父类的访问性低于子类 class Person { } public class Students:Person { } 错误实例二:方法的访问修饰符需要和参数的类型的访问修饰符一致 cl ...
- .net core Identity集成IdentityServer(3) 一键登出
在客户端程序, 我们补充一键登出操作. 使用了idsv之后, 退出的操作需要删除本地cookie, 然后去请求认证服务器, 也删除认证服务器的cookie. 官网给的退出的代码 public asyn ...
- SQL语句NOT IN优化之换用NOT EXISTS
NOT IN查询示例(示例背景描述:根据条件查询Questions表得到的数据基本在PostedData表中不存在,为完全保证查询结果在PostedData表中不存在,使用NOT IN): SET S ...
- CSharp工程中的几个文件
以下基于.NET Framework4.6及.NET Core2.0 .csproj 用于配置项目信息,如: 程序集名称.类型 Framework版本 项目所包含的文件信息,如:cs.html.js. ...
- 如何去掉C#字符串中的所有空格
字符串行数Trim()可以去掉字符串前后的空格,如: C# Code string myString = " this is a test "; Console.WriteLi ...
- 价值1.35亿美元的BUG
价值1.35亿美元的BUG 译者按: 一横值千金啊! 原文: Mariner 1’s $135 million software bug 译者: Fundebug 为了保证可读性,本文采用意译而非直译 ...
- blfs(systemd版本)学习笔记-构建ibus-libpinyin使用中文输入法
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.包的下载地址 1.libpinyin 下载地址:http://deb.debian.org/debian/pool/main ...
- [HTML/CSS]浮动的那点事儿
元素是怎样浮动 元素的水平方向浮动,意味着元素只能左右移动而不能上下移动. 一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 浮动元素之后的元素将围绕它. 浮动元素 ...