簡體   English   中英

使用二分查找查找兩個排序后的 arrays 的所有公共元素

[英]Find all common elements of two sorted arrays use binary search

我已經開始學習Java,所以我有一些愚蠢的問題。 我想找到兩個排序的 arrays 的所有共同元素,使用二進制搜索,下面是我的代碼。 它運行沒有正確的結果。

import java.util.Arrays;

public class CommonElements{
    public static void commonElements(int[] iArr1, int[] iArr2) {
        Arrays.sort(iArr1);
        Arrays.sort(iArr2);
        int index2 = 0, index1 = 0;
        int left1 = 0, right1 = (iArr1.length)-1;

        while (index2 < iArr2.length && index1 < iArr1.length) {
            while (left1 <= right1) {
                int mid1 = (left1 + right1)/2;
                if (iArr2[index2] == iArr1[mid1]) {
                    System.out.print(iArr1[mid1] + " ");
                    index2++;
                } else if (iArr2[index2] > iArr1[mid1])
                    left1 = mid1 + 1;
                else right1 = mid1 - 1;
            }
        }
    }

    public static void main(String[] args) {
        int[] iArr1 = {6,-3,9,-1,0,0,8};
        int[] iArr2 = {-7,6,-3,-5};
        commonElements(iArr1,iArr2);
        System.out.println("END");
    }
}

當您可以使用兩個指針在兩個已排序的 arrays 中查找公共元素時,為什么要對數組進行二進制搜索? 您可以在每次迭代中遞增指向兩個指針中較小值的指針,如果兩個值相等,則表示該元素在兩個 arrays 中是公共的,現在遞增兩個指針並打印公共元素。

    public static void commonElements(int[] iArr1, int[] iArr2) {
        Arrays.sort(iArr1);
        Arrays.sort(iArr2);
        int index2 = 0, index1 = 0;

        while (index2 < iArr2.length && index1 < iArr1.length) {
            if (iArr2[index2] < iArr1[index1]) {
                index2++;
            } else if (iArr2[index2] > iArr1[index1]) {
                index1++;
            } else {
                System.out.print(iArr1[index1] + " ");
                index1++;
                index2++;
            }
        }
    }

輸入:

iArr1 => [-3,-1,0,0,6,8,9], iArr2 => [-7,-5,-3,6]

Output: -3 6

編輯:

如果需要二進制搜索,那么您可以將代碼編輯為這樣的內容,以使其不會陷入無限循環(我已使用注釋標記了更改):

    public static void commonElements(int[] iArr1, int[] iArr2) {
        Arrays.sort(iArr1);
        Arrays.sort(iArr2);
        int index2 = 0, index1 = 0;

        while (index2 < iArr2.length && index1 < iArr1.length) {
            int left1 = 0, right1 = (iArr1.length)-1; // 1) Reinitialize left1 and right1 in each iteration of iArr2.

            while (left1 <= right1) {
                int mid1 = (left1 + right1)/2;
                if (iArr2[index2] == iArr1[mid1]) {
                    System.out.print(iArr1[mid1] + " ");
                    break; // 2) Break out of the binary search when you've found the common element.
                } else if (iArr2[index2] > iArr1[mid1])
                    left1 = mid1 + 1;
                else right1 = mid1 - 1;
            }

            index2++; // 3) Move to next item of iArr2.
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM