Start learning free

LESSON 219 OF 410 · SORTING

Smallest K Integers in O(n log n) Time using Java

Practice O(n log n) Read the full explanation

Given an array of positive integers nums, return the smallest k values, in any order you want.

Example:

Input: nums = [5, 9, 3, 6, 2, 1, 3, 2, 7, 5], k = 4
Output: [1, 2, 2, 3]
Explanation: Smallest number is 1, 2nd smallest is 2, 
            3rd smallest is 2, 4th smallest is 3
The result can be in any order, [2, 1, 3, 2] is also a correct answer.

Note:

For this lesson, your algorithm should run in O(n log n) time and use O(1) extra space besides the returned values, when sorting in place (sorting a copy of nums takes O(n) extra space).
(There are faster solutions which we will discuss in future lessons)


STEP 1 OF 2
    Ctrl + Enter to check

    JAVA · SORTING

    Smallest K in Java, explained

    Understanding the Problem

    The core challenge of this problem is to find the smallest k integers from an array of positive integers. This problem is significant in various applications such as data analysis, where you might need to find the smallest values in a dataset. A common pitfall is to use a naive approach that does not meet the time complexity requirements.

    Approach

    To solve this problem, we can consider the following approaches:

    Naive Solution

    A naive solution would be to sort the entire array and then return the first k elements. While this approach is simple, it is not optimal because it sorts the entire array, which is unnecessary.

    Optimized Solution

    An optimized solution involves using a sorting algorithm that runs in O(n log n) time. We can sort the array and then return the first k elements. This approach meets the time complexity requirement and is straightforward to implement.

    Algorithm

    Here is a step-by-step breakdown of the optimized algorithm:

    1. Sort the array using a sorting algorithm like QuickSort or MergeSort, which runs in O(n log n) time.
    2. Return the first k elements of the sorted array.

    Code Implementation

    import java.util.Arrays;
    
    public class SmallestKIntegers {
        public static int[] findSmallestK(int[] nums, int k) {
            // Step 1: Sort the array
            Arrays.sort(nums);
            
            // Step 2: Create a result array to store the smallest k elements
            int[] result = new int[k];
            
            // Step 3: Copy the first k elements from the sorted array to the result array
            for (int i = 0; i < k; i++) {
                result[i] = nums[i];
            }
            
            return result;
        }
    
        public static void main(String[] args) {
            int[] nums = {5, 9, 3, 6, 2, 1, 3, 2, 7, 5};
            int k = 4;
            int[] smallestK = findSmallestK(nums, k);
            System.out.println(Arrays.toString(smallestK)); // Output: [1, 2, 2, 3]
        }
    }
    

    Complexity Analysis

    The time complexity of this approach is O(n log n) due to the sorting step. The space complexity is O(1) extra space, as we are not using any additional data structures that grow with the input size.

    Edge Cases

    Potential edge cases include:

    • k is greater than the length of the array: This should be handled by either returning the entire array or throwing an error.
    • k is zero: The function should return an empty array.
    • Array contains duplicate values: The function should still return the smallest k values, including duplicates.

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Simple case: nums = [5, 9, 3, 6, 2, 1, 3, 2, 7, 5], k = 4
    • Edge case: nums = [1, 2, 3], k = 5 (k greater than array length)
    • Edge case: nums = [1, 2, 3], k = 0 (k is zero)
    • Array with duplicates: nums = [1, 1, 1, 1], k = 2

    Thinking and Problem-Solving Tips

    When approaching such problems, consider the following tips:

    • Understand the problem constraints and requirements.
    • Think about the most efficient way to solve the problem within the given constraints.
    • Break down the problem into smaller steps and solve each step methodically.
    • Practice solving similar problems to improve your problem-solving skills.

    Conclusion

    In this blog post, we discussed how to find the smallest k integers from an array of positive integers using an optimized approach that runs in O(n log n) time. We covered the problem definition, approach, algorithm, code implementation, complexity analysis, edge cases, and testing. Understanding and solving such problems is crucial for improving your algorithmic thinking and coding skills.

    Additional Resources

    For further reading and practice, consider the following resources:

    • LeetCode - Practice coding problems
    • GeeksforGeeks - Tutorials and coding challenges
    • Coursera - Online courses on algorithms and data structures
    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free