📌  相关文章
📜  数组中最小的元素,精确地重复了“ k”次。

📅  最后修改于: 2021-04-23 07:10:28             🧑  作者: Mango

给定大小为n的数组,目标是找出在k> 0的情况下精确重复“ k”次的最小数字。
假设数组只有正整数,并且每个i = 0到n -1都为1 <= arr [i] <1000。

例子:

Input : arr[] = {2 2 1 3 1}
        k = 2
Output: 1
Explanation:
Here in array,
2 is repeated 2 times
1 is repeated 2 times 
3 is repeated 1 time
Hence 2 and 1 both are repeated 'k' times
i.e 2 and min(2, 1) is 1

Input : arr[] = {3 5 3 2}
        k = 1
Output : 2
Explanation:
Both 2 and 5 are repeating 1 time but
min(5, 2) is 2

简单方法:一种简单的方法是使用两个嵌套循环。外部循环从最左边的元素开始一个接一个地选择一个元素。内部循环检查在其右侧是否存在相同的元素。如果存在,则增加计数并使我们在右侧获得的数字为负,以防止其再次计数。

C++
// C++ program to find smallest number
// in array that is repeated exactly
// 'k' times.
#include 
using namespace std;
  
const int MAX = 1000;
  
int findDuplicate(int arr[], int n, int k)
{
    // Since arr[] has numbers in range from
    // 1 to MAX
    int res = MAX + 1;
    for (int i = 0; i < n; i++) {
        if (arr[i] > 0) {
  
            // set count to 1 as number is present
            // once
            int count = 1;
            for (int j = i + 1; j < n; j++)
                if (arr[i] == arr[j])
                    count += 1;
  
            // If frequency of number is equal to 'k'
            if (count == k)
                res = min(res, arr[i]);
        }
    }
    return res;
}
  
// Driver code
int main()
{
    int arr[] = { 2, 2, 1, 3, 1 };
    int k = 2;
    int n = sizeof(arr) / (sizeof(arr[0]));
    cout << findDuplicate(arr, n, k);
    return 0;
}


Java
// Java program to find smallest number
// in array that is repeated exactly
// 'k' times.
public class GFG {
    static final int MAX = 1000;
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int arr[], int n, int k)
    {
        // Since arr[] has numbers in range from
        // 1 to MAX
        int res = MAX + 1;
        for (int i = 0; i < n; i++) {
            if (arr[i] > 0) {
  
                // set count to 1 as number is
                // present once
                int count = 1;
                for (int j = i + 1; j < n; j++)
                    if (arr[i] == arr[j])
                        count += 1;
  
                // If frequency of number is equal
                // to 'k'
                if (count == k)
                    res = Math.min(res, arr[i]);
            }
        }
        return res;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.length;
        System.out.println(findDuplicate(arr, n, k));
    }
}
// This article is contributed by Sumit Ghosh


Python3
# Python 3 program to find smallest 
# number in array that is repeated 
# exactly 'k' times.
MAX = 1000
  
def findDuplicate(arr, n, k):
  
    # Since arr[] has numbers in 
    # range from 1 to MAX
    res = MAX + 1
      
    for i in range(0, n): 
        if (arr[i] > 0):
  
            # set count to 1 as number 
            # is present once
            count = 1
            for j in range(i + 1, n):
                if (arr[i] == arr[j]):
                    count += 1
  
            # If frequency of number is equal to 'k'
            if (count == k):
                res = min(res, arr[i])
      
    return res
  
# Driver code
arr = [2, 2, 1, 3, 1] 
k = 2
n = len(arr)
print(findDuplicate(arr, n, k))
  
# This code is contributed by Smitha Dinesh Semwal.


C#
// C# program to find smallest number
// in array that is repeated exactly
// 'k' times.
using System;
  
public class GFG {
      
    static int MAX = 1000;
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int[] arr,
                              int n, int k)
    {
          
        // Since arr[] has numbers in range
        // from 1 to MAX
        int res = MAX + 1;
          
        for (int i = 0; i < n; i++) 
        {
            if (arr[i] > 0)
            {
  
                // set count to 1 as number
                // is present once
                int count = 1;
                for (int j = i + 1; j < n; j++)
                    if (arr[i] == arr[j])
                        count += 1;
  
                // If frequency of number is
                // equal to 'k'
                if (count == k)
                    res = Math.Min(res, arr[i]);
            }
        }
          
        return res;
    }
  
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.Length;
          
        Console.WriteLine(
                      findDuplicate(arr, n, k));
    }
}
  
// This article is contributed by vt_m.


PHP
 0) 
        {
  
            // set count to 1 as number is 
            // present once
            $count = 1;
            for ($j = $i + 1; $j < $n; $j++)
                if ($arr[$i] == $arr[$j])
                    $count += 1;
  
            // If frequency of number is 
            // equal to 'k'
            if ($count == $k)
                $res = min($res, $arr[$i]);
        }
    }
    return $res;
}
  
// Driver code
$arr = array(2, 2, 1, 3, 1);
$k = 2;
$n = count($arr);
echo findDuplicate($arr, $n, $k);
  
// This code is contributed by Rajput-Ji
?>


C++
// C++ program to find smallest number
// in array that is repeated exactly
// 'k' times.
#include 
using namespace std;
  
int findDuplicate(int arr[], int n, int k)
{
    // Sort the array
    sort(arr, arr + n);
  
    // Find the first element with exactly
    // k occurrences.
    int i = 0;
    while (i < n) {
        int j, count = 1;
        for (j = i + 1; j < n && arr[j] == arr[i]; j++)
            count++;
  
        if (count == k)
            return arr[i];
  
        i = j;
    }
  
    return -1;
}
  
// Driver code
int main()
{
    int arr[] = { 2, 2, 1, 3, 1 };
    int k = 2;
    int n = sizeof(arr) / (sizeof(arr[0]));
    cout << findDuplicate(arr, n, k);
    return 0;
}


Java
// Java program to find smallest number
// in array that is repeated exactly
// 'k' times.
import java.util.Arrays;
public class GFG {
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int arr[], int n, int k)
    {
        // Sort the array
        Arrays.sort(arr);
  
        // Find the first element with exactly
        // k occurrences.
        int i = 0;
        while (i < n) {
            int j, count = 1;
            for (j = i + 1; j < n && arr[j] == arr[i]; j++)
                count++;
  
            if (count == k)
                return arr[i];
  
            i = j;
        }
  
        return -1;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.length;
        System.out.println(findDuplicate(arr, n, k));
    }
}
// This article is contributed by Sumit Ghosh


Python
# Python program to find smallest number
# in array that is repeated exactly
# 'k' times.
  
def findDuplicate(arr, n, k):
      
    # Sort the array
    arr.sort()
   
    # Find the first element with exactly
    # k occurrences.
    i = 0
    while (i < n):
        j, count = i + 1, 1
        while (j < n and arr[j] == arr[i]):
            count += 1
            j += 1
   
        if (count == k):
            return arr[i]
   
        i = j
          
    return -1
   
# Driver code
arr = [ 2, 2, 1, 3, 1 ];
k = 2
n = len(arr)
print findDuplicate(arr, n, k)
  
# This code is contributed by Sachin Bisht


C#
// C# program to find smallest number
// in array that is repeated exactly
// 'k' times.
using System;
  
public class GFG {
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int[] arr,
                             int n, int k)
    {
          
        // Sort the array
        Array.Sort(arr);
  
        // Find the first element with
        // exactly k occurrences.
        int i = 0;
        while (i < n) {
            int j, count = 1;
            for (j = i + 1; j < n &&
                     arr[j] == arr[i]; j++)
                count++;
  
            if (count == k)
                return arr[i];
  
            i = j;
        }
  
        return -1;
    }
  
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.Length;
          
        Console.WriteLine(
               findDuplicate(arr, n, k));
    }
}
  
// This article is contributed by vt_m.


PHP


C++
// C++ program to find smallest number
// in array that is repeated exactly
// 'k' times.
#include 
using namespace std;
  
const int MAX = 1000;
  
int findDuplicate(int arr[], int n, int k)
{
    // Computing frequencies of all elements
    int freq[MAX];
    memset(freq, 0, sizeof(freq));
    for (int i = 0; i < n; i++) {
        if (arr[i] < 1 && arr[i] > MAX) {
            cout << "Out of range";
            return -1;
        }
        freq[arr[i]] += 1;
    }
  
    // Finding the smallest element with
    // frequency as k
    for (int i = 0; i < MAX; i++) {
  
        // If frequency of any of the number
        // is equal to k starting from 0
        // then return the number
        if (freq[i] == k)
            return i;
    }
  
    return -1;
}
  
// Driver code
int main()
{
    int arr[] = { 2, 2, 1, 3, 1 };
    int k = 2;
    int n = sizeof(arr) / (sizeof(arr[0]));
    cout << findDuplicate(arr, n, k);
    return 0;
}


Java
// Java program to find smallest number
// in array that is repeated exactly
// 'k' times.
public class GFG {
  
    static final int MAX = 1000;
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int arr[], int n, int k)
    {
        // Computing frequencies of all elements
        int[] freq = new int[MAX];
  
        for (int i = 0; i < n; i++) {
            if (arr[i] < 1 && arr[i] > MAX) {
                System.out.println("Out of range");
                return -1;
            }
            freq[arr[i]] += 1;
        }
  
        // Finding the smallest element with
        // frequency as k
        for (int i = 0; i < MAX; i++) {
  
            // If frequency of any of the number
            // is equal to k starting from 0
            // then return the number
            if (freq[i] == k)
                return i;
        }
  
        return -1;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.length;
        System.out.println(findDuplicate(arr, n, k));
    }
}
// This article is contributed by Sumit Ghosh


Python
# Python program to find smallest number
# in array that is repeated exactly
# 'k' times.
  
MAX = 1000
   
def findDuplicate(arr, n, k):
      
    # Computing frequencies of all elements
    freq = [0 for i in range(MAX)]
      
    for i in range(n):
        if (arr[i] < 1 and arr[i] > MAX):
            print "Out of range"
            return -1
        freq[arr[i]] += 1
   
    # Finding the smallest element with
    # frequency as k
    for i in range(MAX):
      
        # If frequency of any of the number
        # is equal to k starting from 0
        # then return the number
        if (freq[i] == k):
            return i
      
    return -1
      
# Driver code
arr = [ 2, 2, 1, 3, 1 ]
k = 2
n = len(arr)
print findDuplicate(arr, n, k)
  
# This code is contributed by Sachin Bisht


C#
// C# program to find smallest number
// in array that is repeated exactly
// 'k' times.
using System;
  
public class GFG {
  
    static int MAX = 1000;
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int[] arr,
                            int n, int k)
    {
          
        // Computing frequencies of all
        // elements
        int[] freq = new int[MAX];
  
        for (int i = 0; i < n; i++)
        {
            if (arr[i] < 1 && arr[i] > MAX)
            {
                Console.WriteLine("Out of range");
                return -1;
            }
              
            freq[arr[i]] += 1;
        }
  
        // Finding the smallest element with
        // frequency as k
        for (int i = 0; i < MAX; i++) {
  
            // If frequency of any of the
            // number is equal to k starting
            // from 0 then return the number
            if (freq[i] == k)
                return i;
        }
  
        return -1;
    }
  
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.Length;
          
        Console.WriteLine(
               findDuplicate(arr, n, k));
    }
}
  
// This article is contributed by vt_m.


PHP
 $MAX)
        {
            echo "Out of range";
            return -1;
        }
        $freq[$arr[$i]] += 1;
    }
  
    // Finding the smallest element with
    // frequency as k
    for ($i = 0; $i < $MAX; $i++)
    {
  
        // If frequency of any of the number
        // is equal to k starting from 0
        // then return the number
        if ($freq[$i] == $k)
            return $i;
    }
  
    return -1;
}
  
    // Driver code
    $arr = array( 2, 2, 1, 3, 1 );
    $k = 2;
    $n = count($arr);
    echo findDuplicate($arr, $n, $k);
  
// This code is contributed by mits
?>


输出:

1

时间复杂度: O(n 2 )
辅助空间: O(1)
此解决方案不需要将数组元素限制在有限范围内。

更好的解决方案:对输入数组进行排序,并找到第一个元素,该元素的出现数为k。

C++

// C++ program to find smallest number
// in array that is repeated exactly
// 'k' times.
#include 
using namespace std;
  
int findDuplicate(int arr[], int n, int k)
{
    // Sort the array
    sort(arr, arr + n);
  
    // Find the first element with exactly
    // k occurrences.
    int i = 0;
    while (i < n) {
        int j, count = 1;
        for (j = i + 1; j < n && arr[j] == arr[i]; j++)
            count++;
  
        if (count == k)
            return arr[i];
  
        i = j;
    }
  
    return -1;
}
  
// Driver code
int main()
{
    int arr[] = { 2, 2, 1, 3, 1 };
    int k = 2;
    int n = sizeof(arr) / (sizeof(arr[0]));
    cout << findDuplicate(arr, n, k);
    return 0;
}

Java

// Java program to find smallest number
// in array that is repeated exactly
// 'k' times.
import java.util.Arrays;
public class GFG {
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int arr[], int n, int k)
    {
        // Sort the array
        Arrays.sort(arr);
  
        // Find the first element with exactly
        // k occurrences.
        int i = 0;
        while (i < n) {
            int j, count = 1;
            for (j = i + 1; j < n && arr[j] == arr[i]; j++)
                count++;
  
            if (count == k)
                return arr[i];
  
            i = j;
        }
  
        return -1;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.length;
        System.out.println(findDuplicate(arr, n, k));
    }
}
// This article is contributed by Sumit Ghosh

Python

# Python program to find smallest number
# in array that is repeated exactly
# 'k' times.
  
def findDuplicate(arr, n, k):
      
    # Sort the array
    arr.sort()
   
    # Find the first element with exactly
    # k occurrences.
    i = 0
    while (i < n):
        j, count = i + 1, 1
        while (j < n and arr[j] == arr[i]):
            count += 1
            j += 1
   
        if (count == k):
            return arr[i]
   
        i = j
          
    return -1
   
# Driver code
arr = [ 2, 2, 1, 3, 1 ];
k = 2
n = len(arr)
print findDuplicate(arr, n, k)
  
# This code is contributed by Sachin Bisht

C#

// C# program to find smallest number
// in array that is repeated exactly
// 'k' times.
using System;
  
public class GFG {
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int[] arr,
                             int n, int k)
    {
          
        // Sort the array
        Array.Sort(arr);
  
        // Find the first element with
        // exactly k occurrences.
        int i = 0;
        while (i < n) {
            int j, count = 1;
            for (j = i + 1; j < n &&
                     arr[j] == arr[i]; j++)
                count++;
  
            if (count == k)
                return arr[i];
  
            i = j;
        }
  
        return -1;
    }
  
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.Length;
          
        Console.WriteLine(
               findDuplicate(arr, n, k));
    }
}
  
// This article is contributed by vt_m.

的PHP


输出:

1

时间复杂度: O(n Log n)
辅助空间: O(1)

高效方法:高效方法是基于数组的数字范围较小(1到1000)的事实。我们通过使用大小为max的频率数组来解决此问题,并将每个数字的频率存储在该数组中。

C++

// C++ program to find smallest number
// in array that is repeated exactly
// 'k' times.
#include 
using namespace std;
  
const int MAX = 1000;
  
int findDuplicate(int arr[], int n, int k)
{
    // Computing frequencies of all elements
    int freq[MAX];
    memset(freq, 0, sizeof(freq));
    for (int i = 0; i < n; i++) {
        if (arr[i] < 1 && arr[i] > MAX) {
            cout << "Out of range";
            return -1;
        }
        freq[arr[i]] += 1;
    }
  
    // Finding the smallest element with
    // frequency as k
    for (int i = 0; i < MAX; i++) {
  
        // If frequency of any of the number
        // is equal to k starting from 0
        // then return the number
        if (freq[i] == k)
            return i;
    }
  
    return -1;
}
  
// Driver code
int main()
{
    int arr[] = { 2, 2, 1, 3, 1 };
    int k = 2;
    int n = sizeof(arr) / (sizeof(arr[0]));
    cout << findDuplicate(arr, n, k);
    return 0;
}

Java

// Java program to find smallest number
// in array that is repeated exactly
// 'k' times.
public class GFG {
  
    static final int MAX = 1000;
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int arr[], int n, int k)
    {
        // Computing frequencies of all elements
        int[] freq = new int[MAX];
  
        for (int i = 0; i < n; i++) {
            if (arr[i] < 1 && arr[i] > MAX) {
                System.out.println("Out of range");
                return -1;
            }
            freq[arr[i]] += 1;
        }
  
        // Finding the smallest element with
        // frequency as k
        for (int i = 0; i < MAX; i++) {
  
            // If frequency of any of the number
            // is equal to k starting from 0
            // then return the number
            if (freq[i] == k)
                return i;
        }
  
        return -1;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.length;
        System.out.println(findDuplicate(arr, n, k));
    }
}
// This article is contributed by Sumit Ghosh

Python

# Python program to find smallest number
# in array that is repeated exactly
# 'k' times.
  
MAX = 1000
   
def findDuplicate(arr, n, k):
      
    # Computing frequencies of all elements
    freq = [0 for i in range(MAX)]
      
    for i in range(n):
        if (arr[i] < 1 and arr[i] > MAX):
            print "Out of range"
            return -1
        freq[arr[i]] += 1
   
    # Finding the smallest element with
    # frequency as k
    for i in range(MAX):
      
        # If frequency of any of the number
        # is equal to k starting from 0
        # then return the number
        if (freq[i] == k):
            return i
      
    return -1
      
# Driver code
arr = [ 2, 2, 1, 3, 1 ]
k = 2
n = len(arr)
print findDuplicate(arr, n, k)
  
# This code is contributed by Sachin Bisht

C#

// C# program to find smallest number
// in array that is repeated exactly
// 'k' times.
using System;
  
public class GFG {
  
    static int MAX = 1000;
  
    // finds the smallest number in arr[]
    // that is repeated k times
    static int findDuplicate(int[] arr,
                            int n, int k)
    {
          
        // Computing frequencies of all
        // elements
        int[] freq = new int[MAX];
  
        for (int i = 0; i < n; i++)
        {
            if (arr[i] < 1 && arr[i] > MAX)
            {
                Console.WriteLine("Out of range");
                return -1;
            }
              
            freq[arr[i]] += 1;
        }
  
        // Finding the smallest element with
        // frequency as k
        for (int i = 0; i < MAX; i++) {
  
            // If frequency of any of the
            // number is equal to k starting
            // from 0 then return the number
            if (freq[i] == k)
                return i;
        }
  
        return -1;
    }
  
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 2, 1, 3, 1 };
        int k = 2;
        int n = arr.Length;
          
        Console.WriteLine(
               findDuplicate(arr, n, k));
    }
}
  
// This article is contributed by vt_m.

的PHP

 $MAX)
        {
            echo "Out of range";
            return -1;
        }
        $freq[$arr[$i]] += 1;
    }
  
    // Finding the smallest element with
    // frequency as k
    for ($i = 0; $i < $MAX; $i++)
    {
  
        // If frequency of any of the number
        // is equal to k starting from 0
        // then return the number
        if ($freq[$i] == $k)
            return $i;
    }
  
    return -1;
}
  
    // Driver code
    $arr = array( 2, 2, 1, 3, 1 );
    $k = 2;
    $n = count($arr);
    echo findDuplicate($arr, $n, $k);
  
// This code is contributed by mits
?>

输出:

1

时间复杂度: O(MAX + n)
辅助空间: O(MAX)

如果范围不受限制,我们可以在O(n)时间内解决吗?
请参阅最小元素正好重复“ k”次(不限于小范围)