题解 | #最长不重复子数组长度问题#
最长不重复子数组长度问题
https://www.nowcoder.com/practice/2b97599367784237aadac4de2008829d?tpId=363&tqId=10614144&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D363
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int longestUniqueSubarrayLength(int[] nums) {
HashSet<Integer> hashSet = new HashSet<>();
int maxLength = Integer.MIN_VALUE;
int tempLength = 0;
for (int i = 0; i < nums.length; i++) {
// 判断哈希表是否包含重复元素
if (hashSet.contains(nums[i])) {
// 如果包含,将最大长度进行更新
maxLength = Math.max(maxLength, tempLength);
// tempLength重置为0
tempLength = 0;
// 哈希表清空
hashSet.clear();
} else {
// 如果不重复,添加此元素
hashSet.add(nums[i]);
// 临时长度++
tempLength++;
}
}
// 最后要再次比较用Math.max,因为可能出现这样一种情况,子序列都是连续的,比如1,2,3,4,5,那么就没有进行最大长度判断
return Math.max(maxLength,tempLength);
}
/**
* 错误解法 我看到有人用dp做这个,是错误的,是连续最长子序列
* 测试用例:{1,2,3,1,1,2,2,3,4} 正确结果应该是3,但这个代码输出的是4,因为没有考虑连续
* @param nums
* @return
*/
public int longestUniqueSubarrayLength(int[] nums) {
HashSet<Integer> hashSet = new HashSet<>();
int [] dp = new int[nums.length];
dp[0] = 1;
hashSet.add(nums[0]);
for (int i = 1; i < nums.length; i++) {
if(hashSet.contains(nums[i])){
dp[i] = dp[i-1];
}else{
dp[i] = dp[i-1]+1;
}
hashSet.add(nums[i]);
}
return dp[nums.length-1];
}
}
本题知识点分析:
1.哈希表的存取
2.数学模拟
3.数组遍历
本题解题思路分析:
1.判断哈希表是否包含重复元素
2. 如果包含,将最大长度进行更新,tempLength重置为0,哈希表清空
3.如果不重复,添加此元素,临时长度++
4.最后要再次比较用Math.max,因为可能出现这样一种情况,子序列都是连续的,比如1,2,3,4,5,那么就没有进行最大长度判断
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~




