LeetCode219 ContainsDuplicateII java题解

题目:

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

解题:

第一种办法:

最直接用双重循环进行判断,o(n^2)复杂度不能通过

第二种办法:

用哈希表,key存数组元素值,value存元素对应的索引,每来一个元素进行判断如果之前没有存过则存进去,如果之前有存则取出之前那个元素的索引值判断是否小于K,小于k返回true,不小于则存进去覆盖之前的那个。

代码:

public static boolean containsNearbyDuplicate(int[] nums, int k) {

	int length=nums.length;
	Hashtable<Integer, Integer> hashtable=new Hashtable<>();
	for(int i=0;i<length;i++)
	{
		if(hashtable.get(nums[i])==null)
		{
			hashtable.put(nums[i], i);
		}
		else {
			int k1=hashtable.get(nums[i]);
			if(i-k1<=k)
				return true;
			else {
				hashtable.put(nums[i], i);
			}

		}
	}
	return false;

    }

第三种办法:用hashset,利用set集合中不能有重复的元素这个特性,也就是说如果之前set已经有这个值,执行添加操作的时候将不能成功添加,我们通过记录set的size大小就可以知道到底有没添加成功。我们维护一个动态变化大小为k+1的滑动窗口,当i小于k+1的时,只要有一次没添加成功,就返回true,当i大于等于k+1时,没添加一个元素之前先去除set中最早添加的那个元素。

代码:

public static boolean containsNearbyDuplicate2(int[] nums, int k) {

int length=nums.length;

Set<Integer> set=new HashSet<>();

for(int i=0;i<length;i++)

{

if(i<k+1)

{

set.add(nums[i]);

if(set.size()<i+1)

return true;

}

else {

set.remove(nums[i-k-1]);

set.add(nums[i]);

if(set.size()<k+1)

return true;

}

}

return false;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-19 12:59:28

LeetCode219 ContainsDuplicateII java题解的相关文章

LeetCode71 Simplify Path java题解

题目: Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", => "/home" path = "/a/./b/../../c/", => "/c" 题解: 解题思路:这题是简化目录,每一级目录前面都有一个斜杠,我可以首先对斜杠进行分割,分割之后得到的结果无外乎4种情况:正常目录名称,空

LeetCode229 MajorityElementII java题解

<p>题目:</p><p><span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">Given an integer array of size </span><span style="box-sizi

LeetCode257 BinaryTreePaths(打印根节点到叶子节点的左右路径) Java题解

题目: Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 / 2 3 5 All root-to-leaf paths are: ["1->2->5", "1->3"] 题解: 用深度优先遍历,类似二叉树的前序变遍历 代码: public class LeetCode257_BinaryTreePat

LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解

题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题解: 和我上面一篇将有序链表转成二叉排序树中用哈希表解的方法是一样的.基本思路:链表中间那个节点为树的根节点.根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分链表的中间节点.后面就依照这个规律依次类推了. public static TreeNode s

LeetCode102 Binary Tree Level Order Traversal Java题解

题解: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] 解

LeetCode110 Blanced Binary Tree Java 题解

题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 题解: 判断一颗二叉树是不是平衡二叉树  ,平衡二叉树是每个节

LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解

题目: Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time and O(1) space? 题解: 推断一个链表是不是回文的,这里要求O(n)时间复杂度和O(1)的空间时间复杂度.总共想了三种办法,三种办法都用到了两个指针,符合题目要求的仅仅有最后一种. 第一种办法:用数组倒着存前半段的链表的值.然后和后半段链表的值进行比較. 这样的解法执行的时间

LeetCode109_Convert Sorted List to Binary Search t题目tiTree(将链表转成二叉排序树) Java题解

题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题解:将一个有序链表转成二叉排序树,如果是一棵相对平衡的排序树,应该是这样的,链表中间那个节点为树的根节点,根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分链表的中间节点,后面就按照这个规律依次类推了.知道上面的规律之后,问题的关键

TopCoder SRMS 1 字符串处理问题 Java题解

Problem Statement   Let's say you have a binary string such as the following: 011100011 One way to encrypt this string is to add to each digit the sum of its adjacent digits. For example, the above string would become: 123210122 In particular, if P i