给定两个排序列表(或数组)和一个数字k,创建一个算法来获取两个列表中最少的k个数

时间:2017-06-25 10:03:53

标签: java arrays algorithm sorting

需要在给定的两个排序数组中找到前3个最小数字。我认为两个数组应首先合并为一个并对其进行排序以获取前3个最小的数字。任何人都可以帮助我合并和排序部分或提供一些建议,任何帮助将不胜感激。

这是我现在到达的地方,我只能得到最小的数字(不是前3,只有一个)。

public class MergeandSort {


public static void main(String[] args) {
    int[] set1 = {1,2,6,9,18};
    int[] set2 = {2,3,7,10,21,30};

    int smallest = set1[0];
    int smallests = set2[0];

    for(int i=0; i < set1.length; i++){
        if(set1[i] < smallest)
            smallest = set1[i];
    }
    for(int k=0; k < set2.length; k++){
        if(set2[k] < smallests)
            smallests = set2[k];
    }

    System.out.println("Smallest Number in Set 1 is : " + smallest);
    System.out.println("Smallest Number in Set 2 is : " + smallests);


}

}

4 个答案:

答案 0 :(得分:4)

数组已经排序,所以你不必遍历整个数组就能找到3个最小的数字。

  • 您只需要同时开始迭代两个数组(即在同一个循环中)。
  • 在每次迭代中,您比较两个数组的当前两个元素(从0索引处的2个元素开始)并取较小的数组
  • 然后,您前进从中获取最小数字的数组的索引。
  • 一旦达到3个元素(3次迭代后),就会突破循环。

这里有一些伪代码可以帮助您入门:

int i = 0;
int j = 0;
int c = 0;
int[] lowest3 = new int[3];
while (true) {
    find the smaller of set1[i] and set2[j] and put it in lowest3[c]
    if set1[i] is smaller, increment i
    otherwise increment j
    increment c
    if (c==3) // you are done
        break;
}
the lowest3 array now contains the 3 lowest numbers of both arrays

当然你可以用任何k交换3。您只需确保i始终小于set1.length且j始终小于set2.length

答案 1 :(得分:1)

如果数组已经排序,只需实现合并排序的合并技术和限制条件,它应该只运行k次(在本例中为3),但不要忘记检查集合的大小是否小于k或不!

        int k = 0,i = 0,j = 0;

        while (k<3 && k<set1.length && k<set2.length )
        {
            if (set1[i] <= set2[j])  
            {
                final_set[k] = set1[i];
                i++;
            }
            else
            {
                final_set[k] = set2[j];
                j++;
            }
            k++;
        }

         while (k<3 && k<set1.length) {
           final_set[k]=set1[i];
           k++;
           i++;
       }   

      while (k<3 && k<set2.length) {
           final_set[k]=set1[j];
           k++;
           j++;
       }    

答案 2 :(得分:0)

这不会起作用:

Array1 = {1,3,5}

Array2 = {2,3,4}

正确的解决方案:{1,2,3}

解决方案的输出:{1,3,4}

答案 3 :(得分:0)

public class MergeandSort {

    public static void main(String[] args) {
        int[] set1 = {1,2,6,9,18};
        int[] set2 = {2,3,7,10,21,30};
        int[] sorted = new int[k];

        int smallest = set1[0];
        int smallests = set2[0];

        int i = 0, j = 0, c = 0;
        while(i < set1.length && j < set2.length && c < k){
            if (set1[i] < set2[j])
                sorted[c++] = arr1[i++];
            else
                sorted[c++] = arr2[j++];

        while (i < set1.length && c < k)
            sorted[c++] = arr1[i++];
        while (j < set2.length && c < k)
            sorted[c++] = arr2[j++];

        System.out.println(sorted);
    }
}

其中 k 是您想要的已排序数字的计数