簡體   English   中英

查找數組中第二小的整數

[英]Finding the second smallest integer in array

我們需要在我們的任務中遞歸地找到一個數組中第二小的整數。 但是,為了更深入地理解這個主題,我想先迭代(在本網站的幫助下),然后自己遞歸進行。

不幸的是,以迭代方式執行此操作非常令人困惑。 我知道解決方案很簡單,但我無法理解它。

以下是我的代碼,到目前為止:

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 條件有效。

禁止陣列重排。

試試這個。 當最小數字是第一個時,第二個條件用於捕獲事件

    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];
        }

    }

@Axel的UPD

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];
    }
}

這是時間復雜度線性 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];
}
    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 !");
    }
}

你可以在 O(n) 時間內完成。 下面是python代碼

def second_small(A):
    if len(A)<2:
        print 'Invalid Array...'
        return
    small = A[0]
    second_small = [1]
    if small >  A[1]:
        second_small,small = A[0],A[1]

    for i in range(2,len(A)):
        if A[i] < second_small and A[i]!=small:
            if A[i] < small:
                second_small = small
                small = A[i]
            else:
                second_small = A[i]
    print small, second_small
A = [12, 13, 1, 10, 34, 1]
second_small(A)
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;
}

很簡單,你可以這樣做

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

試試這個。

    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);
  }

我在 javascript 中使用過Sort函數

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

通過為排序功能提供compareFunction ,數組元素根據函數的返回值進行排序。

class A{
    public static void main (String args[]){
        int array[]= {-5, -4, 0, 2, 10, 3, -3};
        int min;
        int second_min;
        if(array[0]<array[1]){
            min=array[0];
            second_min=array[1];
        }else{
            min=array[1];
            second_min=array[0];
        }
        for(int i=2;i<array.length;i++){
            if(second_min > array[i] && min > array[i]){
                    second_min=min;
                    min=array[i];                              
            }else  if(second_min > array[i] && min < array[i]){
                min=min;
                second_min=array[i];
            }
        }
        System.out.println(min);
        System.out.println(second_min);
    }
}

在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]))

這個怎么樣?

   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);
     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);
}

試試這個……第一個條件檢查兩個值是否都小於數組中的值。 第二個條件,如果值小於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);
}
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();
}
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);

    }

在此處輸入圖片說明

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>
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;
    }

剛剛嘗試了一些測試用例,它奏效了。 請檢查是否正確!

試試這個,程序給出了數組的最低值和第二低值的解決方案。

用數組的第一個元素初始化 min 和 second_min。找出最小值並將其與 second_min 值進行比較。 如果它 (second_min) 大於數組的當前元素和最小值,則將 second_min 值替換為數組的當前元素。

如果 arr[]={2,6,12,15,11,0,3} 像這樣,臨時變量用於存儲之前的 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);
                }

            }

    }
    }

這是一個以線性時間運行的 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
}

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 );

findFirst()返回的OptionalInt可用於處理特殊情況
對於elements.length < 2或多次只包含一個值的elements
這里返回Integer.MAX_VALUE ,如果沒有第二小的整數

嗯,這應該對你有用:

 function getSecondMin(array){ if(array.length < 2) return NaN; let min = Math.min(array[0],array[1]); let secondMin = Math.max(array[0],array[1]) for (let i = 2; i < array.length; i++) { if(array[i]< min){ secondMin = min min = array[i] } else if(array[i] < secondMin){ secondMin = array[i] } } return secondMin; } const secondMin = getSecondMin([1,4,3,100,2]) console.log(secondMin || "invalid array length");

暫無
暫無

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

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