查找两个已经排好序的数组的共同元素

有两个已排序的数组 ,怎么遍历一遍,取出2个相同的元素

这是一道面试题,看上去挺容易(面试时想了好久,没做出来)。没有在网上看到较为满意的算法。

下面是我的思路和代码,欢迎吐槽、交流、指正:

1.遍历一次,怎么确定遍历的大小(次数)?

a).若两个数组的大小相同,相同元素的角标相同,遍历的大小就是其中一个数组的长度(不一定,情况特殊不符合一般性)。

b).若两个数组的大小不同,相同元素的角标相同,遍历的大小就是小的数组长度(也是特殊情况)。

c).若两个数组的大小不确定,相同元素角标也不确定,现在遍历的大小最小是两个数组的大小的和。

2.确定了遍历的次数,怎么找相同的元素?

a).使用n1 , n2两个变量分别记录两个数组当前的角标(n1 , n2 初始值都是0)。

b).若n1大于数组1的长度,这时相同元素已经找完,可以直接结束掉程序(注:下面的代码没有结束)。

c).若n2大于数组2的长度,也可以结束掉程序。

d).若 数组1 在角标 n1 处的值大于 数组2 在 n2处额值,对n2自增。

e).若 数组1 在角标 n1 处的值小于 数组2 在 n2处额值,对n1自增。

f).剩下的这种情况就是数组1在n1处 和数组2 在n2处的值相同。

 

这里是这道题的java代码

我也是学过归并排序后找到的思路,代码里还有归并的影子。

public class GetCommFromTwoOrderArray {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = new int[] { 1, 2, 4, 5, 6};
        int[] b = new int[] { 0, 4, 6, 8};

        getComm(a, b);
    }

    private static void getComm(int[] a, int[] b) {
        // TODO Auto-generated method stub
        int n1 = 0, n2 = 0;
        for (int i = 0; i < a.length + b.length; i++) {
            if (n1 >= a.length) {
                n2++;// return
            } else if (n2 >= b.length) {
                n1++;// retrun
            } else if (a[n1] > b[n2]) {
                n2++;
            } else if (a[n1] < b[n2]) {
                n1++;
            } else if (a[n1] == b[n2]) {
                System.out.println(a[n1]);
                n1 ++ ;
                n2 ++ ;
            }
        }
    }

}

 

 

### 已排数组的常见操作和使用场景 已排数组在编程中具有广泛的应用,其主要特点是元素按照特定顺排列(如升或降)。这种特性使得某些操作更加高效。以下是关于已排数组的一些常见操作和使用场景: #### 1. 二分查找 对于已排数组,二分查找是一种高效的搜索算法,时间复杂度为 \(O(\log n)\)。它通过不断将搜索区间减半来快速定位目标值的位置[^1]。 ```python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` #### 2. 插入元素 在已排数组中插入新元素时,需要先找到合适的位置以保持数组的有性。可以结合二分查找来优化插入过程[^3]。 ```python def insert_into_sorted_array(arr, value): index = binary_search(arr, value) if index == -1: # 如果未找到,则确定插入位置 for i in range(len(arr)): if arr[i] > value: index = i break else: index = len(arr) arr.insert(index, value) ``` #### 3. 删除重复元素 如果已排数组中存在重复元素,可以通过一次遍历删除多余的重复项。由于数组已排,相同的元素必然相邻,因此该操作的时间复杂度为 \(O(n)\)[^2]。 ```python def remove_duplicates(arr): if not arr: return [] result = [arr[0]] for i in range(1, len(arr)): if arr[i] != arr[i - 1]: result.append(arr[i]) return result ``` #### 4. 合并两个已排数组 当需要合并两个已排数组时,可以使用双指针法,确保合并后的数组仍然保持有。此方法的时间复杂度为 \(O(m + n)\),其中 \(m\) 和 \(n\) 分别是两个数组的长度[^1]。 ```python def merge_sorted_arrays(arr1, arr2): merged = [] i, j = 0, 0 while i < len(arr1) and j < len(arr2): if arr1[i] < arr2[j]: merged.append(arr1[i]) i += 1 else: merged.append(arr2[j]) j += 1 merged.extend(arr1[i:]) merged.extend(arr2[j:]) return merged ``` #### 5. 查找最接近的值 在已排数组中,可以快速查找与给定值最接近的元素。此操作通常结合二分查找实现[^3]。 ```python def find_closest_value(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return arr[mid] elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return arr[right] if abs(arr[right] - target) < abs(arr[left] - target) else arr[left] ``` #### 6. 滑动窗口问题 已排数组常用于解决滑动窗口相关的问题,例如计算连续子数组的最大和、最小差等。这类问题通常结合双指针或动态规划实现[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值