查找数组中的第二个最小整数

时间:2015-05-24 20:12:43

标签: java arrays

在我们的赋值中我们需要递归地找到一个数组中的第二个最小整数。但是,为了更好地理解这个主题,我想首先(在本网站的帮助下)迭代地进行,并且我自己递归。

不幸的是,迭代地执行它是非常令人困惑的。我知道解决方案很简单,但我无法绕过它。

以下是我的代码:

public static void main(String[] args) 
{
    int[] elements  = {0 , 2 , 10 , 3, -3 }; 
    int smallest = 0; 
    int secondSmallest = 0; 

    for (int i = 0; i < elements.length; i++)
    {
        for (int j = 0; j < elements.length; j++)
        {
            if (elements[i] < smallest)
            {
                smallest = elements[i];

                if (elements[j] < secondSmallest)
                {
                    secondSmallest = elements[j];
                }
            }
        }

    }

    System.out.println("The smallest element is: " + smallest + "\n"+  "The second smallest element is: " + secondSmallest);
}

这适用于少数数字,但不是全部。数字变化,因为内部if条件不如外部if条件有效。

禁止进行数组重排。

20 个答案:

答案 0 :(得分:7)

Try this one. Second condition is used to catch an event when the smallest number is the first

    int[] elements = {-5, -4, 0, 2, 10, 3, -3};
    int smallest = Integer.MAX_VALUE;
    int secondSmallest = Integer.MAX_VALUE;
    for (int i = 0; i < elements.length; i++) {
        if(elements[i]==smallest){
          secondSmallest=smallest;
        } else if (elements[i] < smallest) {
            secondSmallest = smallest;
            smallest = elements[i];
        } else if (elements[i] < secondSmallest) {
            secondSmallest = elements[i];
        }

    }

UPD by @Axel

    int[] elements = {-5, -4, 0, 2, 10, 3, -3};
    int smallest = Integer.MAX_VALUE;
    int secondSmallest = Integer.MAX_VALUE;
    for (int i = 0; i < elements.length; i++) {
    if (elements[i] < smallest) {
            secondSmallest = smallest;
            smallest = elements[i];
        } else if (elements[i] < secondSmallest) {
            secondSmallest = elements[i];
        }

    }

答案 1 :(得分:3)

这是TimeComlexity线性O(N):

  public static int secondSmallest(int[] arr) {
    if(arr==null || arr.length < 2) {
        throw new IllegalArgumentException("Input array too small");
    }

    //implement
    int firstSmall = -1;
    int secondSmall = -1;

    //traverse to find 1st small integer on array
    for (int i = 0; i<arr.length;i++)
        if (firstSmall == -1 || arr[firstSmall]>arr[i])
            firstSmall = i;

     //traverse to array find 2 integer, and skip first small
    for (int i = 0;i<arr.length;i++) {
        if (i != firstSmall && (secondSmall == -1 || arr[secondSmall] > arr[i]))
            secondSmall = i;
    }

    return arr[secondSmall];
}

答案 2 :(得分:2)

    int[] arr = { 4, 1, 2, 0, 6, 1, 2, 0 };

    int smallest = Integer.MAX_VALUE;
    int smaller = Integer.MAX_VALUE;
    int i = 0;

    if (arr.length > 2) {
        for (i = 0; i < arr.length; i++) {

            if (arr[i] < smallest) {
                smaller = smallest;
                smallest = arr[i];
            } else if (arr[i] < smaller && arr[i] > smallest) {
                smaller = arr[i];
            }
        }

        System.out.println("Smallest number is " + smallest);
        System.out.println("Smaller number is " + smaller);

    } else {
        System.out.println("Invalid array !");
    }
}

答案 3 :(得分:2)

简单地说,你可以这样做

int[] arr = new int[]{34, 45, 21, 12, 54, 67, 15};
Arrays.sort(arr);
System.out.println(arr[1]);

答案 4 :(得分:2)

你可以在O(n)时间内完成。下面是python代码

autoreleasepool

答案 5 :(得分:1)

public static int findSecondSmallest(int[] elements) {
    if (elements == null || elements.length < 2) {
        throw new IllegalArgumentException();
    } 
    int smallest = elements[0]; 
    int secondSmallest = elements[0]; 
    for (int i = 1; i < elements.length; i++) {
        if (elements[i] < smallest) {
            secondSmallest = smallest;
            smallest = elements[i];
        } 
        else if (elements[i] < secondSmallest) {
            secondSmallest = elements[i];
        }
    }
    return secondSmallest;
}

答案 6 :(得分:0)

lambda 中的直接解决方案

int[] first = {Integer.MAX_VALUE};
int rslt = IntStream.of( elements ).sorted().dropWhile( n -> {
    boolean b = n == first[0] || first[0] == Integer.MAX_VALUE;
    first[0] = n;
    return( b );
} ).findFirst().orElse( Integer.MAX_VALUE );

OptionalInt返回的findFirst()可用于处理特殊情况
对于 elements.length < 2elements 多次只包含一个值
here Integer.MAX_VALUE 返回,如果没有第二小的整数

答案 7 :(得分:0)

这是一个线性运行的Swift版本。基本上,找到最小的数字。然后将第二个最小值指定为最大值。然后遍历数组,找到一个大于最小的数字,但小于到目前为止找到的第二个最小数字。

func findSecondMinimumElementLinear(in nums: [Int]) -> Int? {
    // If the size is less than 2, then returl nil.
    guard nums.count > 1 else { return nil }

    // First, convert it into a set to reduce duplicates.
    let uniqueNums = Array(Set(nums))

    // There is no point in sorting if all the elements were the same since it will only leave 1 element
    // after the set removed duplicates.
    if uniqueNums.count == 1 { return nil }

    let min: Int = uniqueNums.min() ?? 0 // O(n)
    var secondMinNum: Int = uniqueNums.max() ?? 0 // O(n)
    // O(n)
    for num in uniqueNums {
        if num > min && num < secondMinNum {
            secondMinNum = num
        }
    }

    return secondMinNum
}

答案 8 :(得分:0)

尝试一下,程序为数组的最小值和第二个最小值提供了解决方案。

用array的第一个元素初始化min和second_min。找出最小值并将其与second_min值进行比较。如果它(second_min)大于数组的当前元素和最小值,则second_min值将替换为数组的当前元素。

在arr [] = {2,6,12,15,11,0,3}这样的情况下,temp变量用于存储先前的second_min值。

public class Main
    {
        public static void main(String[] args) {
            //test cases.
            int arr[]={6,12,1,11,0};
            //int arr[]={0,2,10,3,-3}; 
            //int arr[]={0,0,10,3,-3}; 
            //int arr[]={0,2 ,10, 3,-3}; 
            //int arr[]={12,13,1,10,34,1};
            //int arr[]={2,6,12,15,11,0,3};
            //int arr[]={2,6,12,15,1,0,3};
            //int arr[]={2,6,12,15};
            //int arr[]={0,1};
            //int arr[]={6,16};
            //int arr[]={12};
            //int arr[]={6,6,6,6,6,6};
            int position_min=0;
            int min=arr[0];int second_min=arr[0]; int temp=arr[0];
            if(arr.length==1)
            {
                System.out.println("Lowest value is "+arr[0]+"\n Array length should be greater than 1. ");
            }
            else if(arr.length==2)
            {
                if(arr[0]>arr[1])
                {
                    min=arr[1];
                    second_min=arr[0];
                    position_min=1;
                }
                else
                {
                    min=arr[0];
                    second_min=arr[1];
                    position_min=0;
                }
                System.out.println("Lowest value is "+min+"\nSecond lowest value is "+second_min);
            }
            else
            {
                for( int i=1;i<arr.length;i++)
                {
                   if(min>arr[i])
                   {
                       min=arr[i];
                       position_min=i;
                   }
                }
                System.out.println("Lowest value is "+min);
                for(int i=1;i<arr.length;i++)
                {
                    if(position_min==i)
                    {

                    }
                    else
                    {
                         if(second_min > min & second_min>arr[i])
                         {
                             temp=second_min;
                             second_min=arr[i];
                         }
                         else if(second_min == min )
                         {
                             second_min=arr[i];
                         }
                    }
                }

                if(second_min==min )
                {
                    second_min=temp;
                }
                //just for message if in case all elements are same in array.
                if(temp==min && second_min==min)
                {
                    System.out.println("There is no Second lowest element in array.");
                }
                else{
                    System.out.println("\nSecond lowest value is "+second_min);
                }

            }

    }
    }

答案 9 :(得分:0)

怎么样?

   int[] result = Arrays.asList(-3, 4,-1,-2).stream()
            .reduce(new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE},
                    (maxValues, x) -> {
                        if (x > maxValues[0]) {
                            maxValues[1] = maxValues[0]; //max becomes second max
                            maxValues[0] = x;
                        }
                        else if (x > maxValues[1]) maxValues[1] = x;
                        return maxValues;
                    }
                    , (x, y) -> x);

答案 10 :(得分:0)

找到简短而简单的Python数组中的第二个最小元素

def second_minimum(arr):
second = arr[1]
first = arr[0]

for n in arr:
    if n < first:
        first = n
    if n > first and n < second  :
        second = n

return second

print(second_minimum([-2, 4, 5, -1, 2, 3, 0, -4, 1, 99, -6, -5, -19]))

答案 11 :(得分:0)

Session

答案 12 :(得分:0)

public static int getSecondSmallest(int[] arr){
        int smallest = Integer.MAX_VALUE;
        int secondSmallest = Integer.MAX_VALUE;
        for(int i=0;i<arr.length;i++){
            if(smallest > arr[i]){
                secondSmallest = smallest;
                smallest = arr[i];
            }else if (secondSmallest > arr[i] && arr[i] != smallest){
            secondSmallest = arr[i];
        }
            System.out.println(i+" "+smallest+" "+secondSmallest);
        }
        return secondSmallest;
    }

尝试了一些测试用例并且有效。请检查一下是否正确!

答案 13 :(得分:0)

我在javascript中使用了Sort函数

function sumTwoSmallestNumbers(numbers){  
  numbers = numbers.sort(function(a, b){return a - b; });
  return numbers[0] + numbers[1];
};

通过为排序功能提供compareFunction数组元素根据函数的返回值进行排序。

答案 14 :(得分:0)

试试这个。

    public static void main(String args[]){
        int[] array = new int[]{10, 30, 15, 8, 20, 4};

        int min, secondMin;

        if (array[0] > array[1]){
            min = array[1];
            secondMin = array[0];
        }
        else{
            min = array[0];
            secondMin = array[1];
        }

        for (int i=2; i<array.length; i++){
            if (array[i] < min){
                secondMin = min;
                min = array[i];
            }
            else if ((array[i] > min) && (array[i] < secondMin)){
                secondMin = array[i];
            }
        }
       System.out.println(secondMin);
  }

答案 15 :(得分:0)

enter image description here

public class SecondSmallestNumberInArray 
        {
            public static void main(String[] args) 
            {
                int arr[] = { 99, 76, 47, 85, 929, 52, 48, 36, 66, 81, 9 };
                int smallest = arr[0];
                int secondSmallest = arr[0];

                System.out.println("The given array is:");
                boolean find = false;
                boolean flag = true;

                for (int i = 0; i < arr.length; i++) 
                {
                    System.out.print(arr[i] + "  ");
                }

                System.out.println("");

                while (flag) 
                {
                    for (int i = 0; i < arr.length; i++) 
                    {
                        if (arr[i] < smallest) 
                        {   
                            find = true;
                            secondSmallest = smallest;
                            smallest = arr[i];
                        } else if (arr[i] < secondSmallest) {   
                            find = true;
                            secondSmallest = arr[i];
                        }
                    }
                    if (find) {
                        System.out.println("\nSecond Smallest number is Array : ->  " + secondSmallest);
                        flag = false;
                    } else {
                        smallest = arr[1];
                        secondSmallest = arr[1];
                    }
                }
            }
        }

    **Output is**

    D:\Java>java SecondSmallestNumberInArray

    The given array is:

    99  76  47  85  929  52  48  36  66  81  9

    Second Smallest number is Array : ->  36

    D:\Java>

答案 16 :(得分:0)

public static void main(String[] args)  {
    int arr[] = {6,1,37,-4,12,46,5,64,21,2,-4,-3};
    int lowest =arr[0];
    int sec_lowest =arr[0];
    for(int n : arr){
        if (lowest >  n)
        {
            sec_lowest = lowest;
            lowest = n;

        }
        else if (sec_lowest > n && lowest != n)
            sec_lowest = n;
    }

    System.out.println(lowest+"   "+sec_lowest);

    }

答案 17 :(得分:0)

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.println("Enter array size = ");
    int size=in.nextInt();
    int[] n = new int[size];
    System.out.println("Enter "+ size +" values ");

    for(int i=0;i<n.length;i++)
        n[i] = in.nextInt();
    int small=n[0],ssmall=n[0];

    // finding small and second small
    for(int i=0;i<n.length;i++){
        if(small>n[i]){
            ssmall=small;
            small=n[i];
            }else if(ssmall>n[i])
                ssmall=n[i];
    }

    // finding second small if first element itself small
    if(small==n[0]){
        ssmall=n[1];
        for(int i=1;i<n.length;i++){
            if(ssmall>n[i]){
                ssmall=n[i];
                }
        }
    }

    System.out.println("Small "+ small+" sSmall "+ ssmall);

    in.close();
}

答案 18 :(得分:0)

    try this ...
first condition checks if both values are less than value in array.
second condition if value is less than small than smallest=element[i]
else secondSmallest=elements[i]..

        public static void main(String[] args) 
        {
            int[] elements  = {0 , 2 , 10 , 3, -3 }; 
            int smallest = elements[0];
            int secondSmallest = 0; 

              for (int i = 0; i < elements.Length; i++)
                {
                    if (elements[i]<smallest || elements[i]<secondSmallest )
                    {
                        if (elements[i] < smallest )
                        {
                            secondSmallest  = smallest ;
                            smallest = elements[i];

                        }
                        else
                        {
                            secondSmallest = elements[i];

                        }
                    }
                }

            System.out.println("The smallest element is: " + smallest + "\n"+  "The second smallest element is: " + secondSmallest);
        }

答案 19 :(得分:0)

     public static void main(String[] args) 
{
    int[] elements  = {-4 , 2 , 10 , -2, -3 }; 
    int smallest = Integer.MAX_VALUE; 
    int secondSmallest = Integer.MAX_VALUE; 

    for (int i = 0; i < elements.length; i++)
    {
        if (smallest>elements[i])
            smallest=elements[i];

    }

    for (int i = 0; i < elements.length; i++)
    {
        if (secondSmallest>elements[i] && elements[i]>smallest)
            secondSmallest=elements[i];

    }

    System.out.println("The smallest element is: " + smallest + "\n"+  "The second smallest element is: " + secondSmallest);
}