【问题标题】:Find the value that is in both array找到两个数组中的值
【发布时间】:2019-08-04 19:31:19
【问题描述】:

关于 SO 上的交集有一个这样的问题,但它对我没有帮助。 我有一个严格的规则要遵守。 原始解决方案

static int solution(int[] A, int[] B) {
        int n = A.length;
        int m = B.length;

        Arrays.sort(A);
        Arrays.sort(B);

        int i = 0;
        for (int k = 0; k < n; k++) {
            if (i < m - 1 && B[i] < A[k]) i += 1;
            if (A[k] == B[i]) return A[k];
        }
        return -1;
    }

此解决方案是正确的,但并非在所有情况下都是正确的,例如 arr1={6,6,6,6} arr2={2,4,5,9,6}

它不会导致 6 所以任务是只添加两行代码来使其工作。我添加了这个

 int[] acopy = Arrays.copyOf(A, A.length);
        A = n > m ? A : B;
        B = n > m ? B : acopy;
        n = A.length;
        m = B.length;

现在该任务将返回 6

但是当数组是这样的时候

int[] x1 = {0, 2, 7, 10, 23, 345, 56, 456, 767, 56, 6, 80, 6, 65}; int y1[] = {1, 4, 5, 9, 9, 9, 80, 67, 77};

它不返回 80 现在我不确定我应该添加什么,我的代码不应该更改但可以添加一行修改。

【问题讨论】:

  • 我认为您需要在 for 循环中添加一个 for 循环
  • 我不需要 if 语句对吗?除了检查平等性的那个
  • 你需要在循环中循环,不需要对输入数组进行排序
  • 排序已经添加,在这个任务上,它的代码任务指令不能删除但可以添加
  • 循环是最直接的解决方案,时间复杂度也是最优的。我认为您可以添加自己的答案并将其标记为已接受。

标签: java arrays algorithm


【解决方案1】:

我对您添加的原始功能进行了一些修改,但我不确定这些修改是否满足您所说的限制,但无论如何,这里有一个适用于您提到的所有情况的版本:

static int solution(int[] A, int[] B) {
        int n = A.length;
        int m = B.length;

        Arrays.sort(A);
        Arrays.sort(B);

        int i = 0;
        for (int k = 0; k < n && i < m;) {
            if (A[k] == B[i]) return A[k];
            if (i <= m - 1 && B[i] < A[k]) i += 1;
            else if (k <= n - 1 && A[k] < B[i]) k += 1;
        }
        return -1;
    }

这里你只需要增加k iff A[k] i < m以避免无限循环,以防元素之间没有匹配,所以你成功返回-1

【讨论】:

    【解决方案2】:

    试试 set 和 hashset,

    Set<Integer> firstSet = new HashSet<Integer>(Arrays.asList(1,2,3,4,5,6));
    Set<Integer> secondSet= new HashSet<Integer>(Arrays.asList(2,6,7,8,9,0,1));
    firstSet.retainAll(secondSet);
    Integer[] commonData= firstSet.toArray(new Integer[firstSet.size()]);
    

    这会将两个整数数组中的所有公共值放在 commonData 中

    【讨论】:

      【解决方案3】:

      就像Mis94在这里说的,你只需要增加值较低的一侧的索引,这是我解决这个问题的方法

      static int solution(int[] A, int[] B) {
          int n = A.length;
          int m = B.length;
      
          Arrays.sort(A);
          Arrays.sort(B);
      
          int i = 0;
          for (int k = 0; k < n; k++) {
              if (i < m - 1 && B[i] < A[k]) { i += 1; k--; continue; }
              if (A[k] == B[i]) return A[k];
          }
          return -1;
      }
      

      我希望这遵循说明

      【讨论】:

      • 这很好,但 continue 关键字,我认为在这里不起作用? @Mostafa Amin
      • 如果 a = {6,6,6,6} ==> k=0, A[k]=6 b = {2,4 在某些情况下,如果不继续,您将收到错误,5,6,9}==> i=0, B[i]=2 然后第一个 if 语句匹配使 i = 1 和 k = -1 然后你会检查 A[-1] == B[ 1]导致错误
      【解决方案4】:

      为您的示例提供类似合并方法 returns80 的正确代码

      static int solution(int[] A, int[] B) {
          int n = A.length;
          int m = B.length;
      
          Arrays.sort(A);
          Arrays.sort(B);
      
          int i = 0;
          int j = 0;
          while (i < n && j < m) {
              if (A[i] == B[j]) 
                  return A[i];
              else {
                  if (A[i] > B[j]) 
                      j++;
                  else
                      i++;
              }
          }     
          return -1;
      }
      

      【讨论】:

        【解决方案5】:

        slopeSearch 在矩阵 a 中搜索找到值 x 的位置。为了使搜索成功,要求矩阵的每一行和每一列都按非降序排序。

            Int [] slopeSearh (int [][] a, int x) {
                Int m = a.length;
                Int n = [0] a.length;
                Int i = 0;
                Int j = n-1;
                While (i<m && j>=0) {
                    if (a[i] [j] == x) return new int[] (i,j) ;
                    if (a[i] [j] < x) i++;
                    else j--;
                }
                Return null;
            }
        

        进行斜率搜索分析并使用渐近符号表示分析结果

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-31
          • 1970-01-01
          • 1970-01-01
          • 2020-12-04
          • 2017-01-07
          • 2017-12-29
          • 2012-09-08
          • 2016-05-18
          相关资源
          最近更新 更多