一道算法題:查找數組 arr 中第 k 小的奇數

題目描述

查找數組 arr 中第 k 小的奇數,如果不存在則返回 0. (arr [i] > 0 (i>=0))

計算出時間複雜度(注意代碼註釋,儘可能不用全排序,不要使⽤庫函數或腳本中已經實現好的排序算法和⼯具,需要⾃⼰實現數據結構和所需要的算法)

解題方案

思路

  • 屬於 Top K 問題
  • 假設數組中數據範圍有限,使用一個額外數組,存放每個數字出現的次數,數組下標位置就是數字大小,此種方式爲「計數排序法」
  • 時間複雜度:O(N),N 爲第 k 小的奇數的大小
  • 最壞時間複雜度:當不存在時,需要遍歷完 counter 數組,O(M),M 爲指定數組的範圍
  • 空間複雜度:O(M),需要長度爲 M 的額外數組。
  • 標籤:計數排序

代碼

// Java
class Solution {
    public int findKth(int[] arr, int k) {
        if (k == 0) {
            return 0;
        }
        // 統計每個數字出現的次數
        int[] counter = new int[10001];
        for (int num : arr) {
            counter[num] = counter[num] + 1;
        }
        int x = 0;
        // 遍歷 counter,查找第 k 小的奇數
        for (int num = 0; num < counter.length; num++) {
            if (counter[num] > 0 && x < k && num % 2 == 1) {
                x++;
            }
            if (x == k) {
                return num;
            }
        }
        return 0;
    }
}

測試代碼

    public static void main(String[] args) {
        int[] arr = {1, 4, 23, 2, 6, 9, 13, 5, 45, 12};
        int k = 3;
        System.out.println(new Solution().findKth(arr, k));
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章