如何解决219.包含重复II-为什么使用二进制搜索的解决方案在未排序的数组上起作用?
问题:给定一个整数数组和一个整数k,找出数组中是否存在两个不同的索引i和j,使得nums [i] = nums [j]和绝对值i和j之差最多为k。
示例1:
输入:nums = [1,2,3,1],k = 3输出:true
我使用HashSet(java)解决了这个问题。
但是当我查看下面提交的一些解决方案时,引起了我的注意:
public boolean containsNearbyDuplicate(int[] nums,int k)
{
int len = nums.length;
for(int i=0; i<len; i++)
{
int j = Arrays.binarySearch(nums,nums[i]);// Y this works as array is not sorted. Copied sol from submitted solution
if(i != j && Math.abs(i-j) <= k)
{
return true;
}
}
return false;
}
- 未对输入数组进行排序,然后说明了为什么此代码起作用以及它是可接受的解决方案。
- 如果问题之间的差异至少是最大,那么该如何解决呢?
解决方法
您对此解决方案的正确性有疑问,您说得对。这不是一个声音算法。如果它通过了测试用例,那就意味着测试不够彻底。
这是一个反例:
[9,9,1,2,3]
1
该代码将返回false
,而它应返回true
。
很明显,如果执行二进制搜索以找到9,则将找不到它,因为它将查找数组的后半部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。