用Java写 给订一个长度为n的数组arr 数组是无序的 返回arr的最长无重复元素子数组的长度
时间: 2024-01-21 18:16:53 浏览: 113
可以使用滑动窗口来解决这个问题,具体步骤如下:
1. 定义一个哈希表 map,用于存储每个元素最后一次出现的位置。
2. 定义两个指针 left 和 right,分别表示滑动窗口的左右边界。
3. 遍历数组 arr,当遇到重复元素时,将 left 指针移到重复元素的下一个位置,并更新 map 中重复元素的位置。
4. 计算当前滑动窗口的长度 len = right - left + 1,并更新最大长度 maxLen。
5. 遍历完成后,返回 maxLen。
Java代码实现如下:
```java
public static int maxLength(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int n = arr.length;
int maxLen = 1; // 最长无重复元素子数组的长度
Map<Integer, Integer> map = new HashMap<>(); // 存储每个元素最后一次出现的位置
int left = 0; // 滑动窗口的左边界
for (int right = 0; right < n; right++) { // 滑动窗口的右边界
int num = arr[right];
if (map.containsKey(num)) {
// 如果当前元素已经出现过,则将左边界移到重复元素的下一个位置
left = Math.max(left, map.get(num) + 1);
}
map.put(num, right); // 更新元素的最后一次出现位置
int len = right - left + 1; // 计算当前滑动窗口的长度
maxLen = Math.max(maxLen, len); // 更新最长无重复元素子数组的长度
}
return maxLen;
}
```
测试代码如下:
```java
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 2, 5, 6, 7, 8, 9, 10};
System.out.println(Arrays.toString(arr1) + " 最长无重复元素子数组的长度为:" + maxLength(arr1));
int[] arr2 = {1, 2, 3, 2, 1, 6, 7, 8, 9, 10};
System.out.println(Arrays.toString(arr2) + " 最长无重复元素子数组的长度为:" + maxLength(arr2));
int[] arr3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println(Arrays.toString(arr3) + " 最长无重复元素子数组的长度为:" + maxLength(arr3));
}
```
输出结果如下:
```
[1, 2, 3, 2, 5, 6, 7, 8, 9, 10] 最长无重复元素子数组的长度为:8
[1, 2, 3, 2, 1, 6, 7, 8, 9, 10] 最长无重复元素子数组的长度为:7
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 最长无重复元素子数组的长度为:10
```
阅读全文