无重复子数组&有序数组合并

359 阅读1分钟

前言

“这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

  1. NC41 最长无重复子数组(中等)
  2. 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++];
        }
    }