[劍指Offer]-數組中出現次數超過一半的數字

題目描述

數組中一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲 9 的數組{1,2,3,2,2,2,5,4,2}。由於數字 2 在數組中出現了 5 次,超過數組長度的一半,因此輸出 2.

解題思路

  • 當我們遍歷到下一個數字的時候,
  • 如果下一個數字和當前我們保存的數字相同,則次數加 1;
  • 如果和當前我們保存的數字不同,則次數減 1;
  • 當次數減到 0 的時候,我們將保存的數字改爲當前遍歷所處的位置,並將次數更改爲 1。時間複雜度O(n)
算法圖解

在這裏插入圖片描述

參考代碼:
package offer;

/**
 * 數組中出現次數超過一半的數字
 * 數組中一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲 9 的數組{1,2,3,2,2,2,5,4,2}。由於數字 2 在數組中出現了 5 次,超過數組長度的一半,因此輸出 2.
 */
public class Offer39 {
    public static void main(String[] args) {
        int nums[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};
        System.out.println(findMoreHalf(nums));
    }

    /**
     * O(n)
     * @param nums
     * @return
     */
    static int findMoreHalf(int nums[]) {
        if (nums == null || nums.length <= 1) {
            return 0;
        }
        int tag = 1;
        int result=nums[0];
        for (int i = 0; i < nums.length - 1; i++) {
            int curent = nums[i];
            if (tag == 0) {
                result= nums[i];
                tag = 1;
            }
            if (curent == nums[i + 1]) {
                tag++;
            } else {
                tag--;
            }

        }
        return result;
    }

}

題目描述(最小K個數)

輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。

解題思路

  • 排序後輸出。時間複雜度O(nlogn)
算法圖解
參考代碼:
package offer;

import java.util.Arrays;

/**
 * 最小的K個數
 * 輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。
 */
public class Offer40 {
    public static void main(String[] args) {
        int nums[] = {4, 5, 1, 6, 2, 7, 3, 8};
        int k = 5;
        /**
         * 排序後找
         */
        Arrays.sort(nums);
        for (int i = 0; i < k; i++) {
            System.out.println(nums[i]);
        }

    }


}


附錄

該題源碼在我的 ?Github 上面!

發佈了171 篇原創文章 · 獲贊 187 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章