前言
“这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战”
- NC41 最长无重复子数组(中等)
- NC22 合并两个有序的数组(简单)
最长无重复子数组
描述:给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
输入:[1,2,3,1,2,3,2,2]
返回值:3
说明:最长子数组为[1,2,3]
思路分析:双指针 + 哈希表实现
定义2个指针 left 和 right , left 指向无重复子数组区间的起始位置, right 指针指向当前遍历到元素的位置 哈希表 map 记录遍历过程中元素的最新位置 在遍历过程中, 遍历到元素 data, 当前 map 中 data的值为上一次 data 出现的位置
AC 代码:
public int maxLength (int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
Map<Integer, Integer> map = new HashMap<>();
int left = 0;
int right = 0;
int len = arr.length;
int ans = 0;
while (right < len) {
int val = arr[right];
int preIndex = map.getOrDefault(val, -1);
left = Math.max(left, preIndex + 1);
map.put(val, right);
ans = Math.max(ans, right - left + 1);
right++;
}
return ans;
}
合并两个有序的数组
描述:
给出一个整数数组 和有序的整数数组
,请将数组
合并到数组
中,变成一个有序的升序数组
注意:
1.可以假设 数组有足够的空间存放
数组的元素,
和
中初始的元素数目分别为
和
,
的数组空间大小为
+
2.不要返回合并的数组,返回是空的,将数组 的数据合并到
里面就好了
3.数组在[0,m-1]的范围也是有序的
思路分析: 将A 数组中的前 m 个元素,分别向后移动 n 个位置; 然后使用两个指针分别指向 有序数组的头部, 比较指针指向数据的大小,将小的数据填入A数组中并更新该指针, 循环遍历即可
AC 代码:
public void merge(int A[], int m, int B[], int n) {
for (int i = m - 1; i >= 0; i--) {
A[i + n] = A[i];
}
int indexA = n;
int indexB = 0;
int index = 0;
while (indexA < m + n && indexB < n) {
if (A[indexA] <= B[indexB]) {
A[index++] = A[indexA++];
} else {
A[index++] = B[indexB++];
}
}
while (indexB < n) {
A[index++] = B[indexB++];
}
}