Special Array With X Elements Greater Than or Equal X

🏠 ⬅️ ➡️

You are given an array nums of non-negative integers. nums is considered special if there exists a number x such that there are exactly x numbers in nums that are greater than or equal to x.

Notice that x does not have to be an element in nums.

Return x if the array is special, otherwise, return -1. It can be proven that if nums is special, the value for x is unique.

Example 1:

Input: nums = [3,5] Output: 2 Explanation: There are 2 values (3 and 5) that are greater than or equal to 2.

Example 2:

Input: nums = [0,0] Output: -1 Explanation: No numbers fit the criteria for x. If x = 0, there should be 0 numbers >= x, but there are 2. If x = 1, there should be 1 number >= x, but there are 0. If x = 2, there should be 2 numbers >= x, but there are 0. x cannot be greater since there are only 2 numbers in nums.

Example 3:

Input: nums = [0,4,3,0,4] Output: 3 Explanation: There are 3 values that are greater than or equal to 3.

Constraints:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

Note: This problem is from LeetCode.
Compiled
Executed
Correct
program main
    implicit none

    integer, parameter :: n = 2
    integer, dimension(n) :: nums = (/ 3, 5 /)
    integer :: x

    x = special(nums)
    write (*, '(I0)') x

contains

    function special(nums) result(x)
        implicit none
        integer, intent(in) :: nums(:)
        integer :: x, i, count

        do i = 1, size(nums)
            count = count_if(nums > i)
            if (count == i) then
                x = i
                exit
            end if
        end do

        if (x < 0) then
            x = -1
        end if

    end function special

end program main
Compiled
Executed
Correct
module special_array

implicit none

contains

function special_array(nums) result(x)

! Given an array of non-negative integers, return the special value x
! if the array is special, otherwise return -1.
! It can be proven that if nums is special, the value for x is unique.

integer, intent(in) :: nums(:)
integer :: x

! Edge case: if the array is empty, return -1
if (size(nums) == 0) then
    x = -1
    return
endif

! Initialize variables
integer :: i, j, count
integer :: min_count, min_x
logical :: found

! Initialize the minimum count and x
min_count = huge(min_count)
min_x = -1

! Loop through the array and find the minimum count and x
do i = 1, size(nums)
    count = 0
    do j = 1, size(nums)
        if (nums(j) >= i) then
            count = count + 1
        endif
    enddo
    if (count < min_count) then
        min_count = count
        min_x = i
    endif
enddo

! Check if the array is special
found = .false.
do i = 1, size(nums)
    if (nums(i) >= min_x) then
        found = .true.
        exit
    endif
enddo

! Return the special value x if the array is special, otherwise return -1
if (found) then
    x = min_x
else
    x = -1
endif

end function special_array

end module special_array

program test_special_array

use special_array

implicit none

! Test case 1: [3, 5]
write (*,*) special_array([3, 5])

! Test case 2: [0, 0]
write (*,*) special_array([0, 0])

! Test case 3: [0, 4, 3, 0, 4]
write (*,*) special_array([0, 4, 3, 0, 4])

end program test_special_array
🌐 Data from online sources
def specialArray(nums):
    max_val = max(nums)
    for x in range(1, max_val + 1):
        count = sum([1 for num in nums if num >= x])
        if count == x:
            return x
    return -1
  1. Find the maximum value in the input array nums.
  2. Iterate through the range [1, max_val] (both inclusive) and for each value of x, count the elements greater than or equal to x in the input array.
  3. If the count of such elements is equal to x, return x.
  4. If no such x is found, return -1.
🌐 Data from online sources
int specialArray(vector<int>& nums) {
    int max_val = *max_element(nums.begin(), nums.end());
    for (int x = 1; x <= max_val; ++x) {
        int count = 0;
        for (int num : nums) {
            if (num >= x) count++;
        }
        if (count == x) return x;
    }
    return -1;
}
  1. Find the maximum value in the input array nums.
  2. Iterate through the range [1, max_val] (both inclusive) and for each value of x, count the elements greater than or equal to x in the input array.
  3. If the count of such elements is equal to x, return x.
  4. If no such x is found, return -1.