1. 程式人生 > 其它 >LeetCode-陣列篇

LeetCode-陣列篇

1.只出現一次的數字

難度:簡單

給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例1:

輸入: [2,2,1]
輸出: 1

示例2:

輸入: [4,1,2,1,2]
輸出: 4

解題思路:

這道題有很多種解法,但是題目要求不使用額外的空間,最簡單的方法就是使用異或運算來解決。

異或運算滿足三個性質:

熟記這三條性質,就是解決尋找重複問題的關鍵所在。

class Solution {
    public int singleNumber(int[] nums) {

        
int result = 0; // 遍歷陣列中每一個數字,進行異或運算 for (int num : nums) { result ^= num; } return result; } } /** 時間複雜度:O(n)遍歷的陣列長度 空間複雜度:O(1) 不需要藉助額外的空間 */

2.多次元素

難度:簡單

給定一個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列中出現次數 大於⌊ n/2 ⌋的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。

示例1:

輸入:[3,2,3]
輸出:
3

示例2:

輸入:[2,2,1,1,1,2,2]
輸出:2

解題思路:

藉助雜湊表統計陣列中每一個數字出現的個數,然後進行相應的業務處理。

class Solution {
    public int majorityElement(int[] nums) {
        // 先扔進自定義的方法裡,計算出陣列中每一個數出現的個數
        Map<Integer, Integer> counts = countNums(nums);

        // 遍歷map,尋找個數最大的數
        Map.Entry<Integer, Integer> majorityEntry = null
; for (Map.Entry<Integer,Integer> entry : counts.entrySet()) { if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) { majorityEntry = entry; } } return majorityEntry.getKey(); } // 使用雜湊表 // 自定義計算陣列出現個數的方法 private Map<Integer, Integer> countNums(int[] nums) { Map<Integer, Integer> counts = new HashMap<Integer, Integer>(); for (int num : nums) { if (!counts.containsKey(num)) { // 沒有就新新增一個 counts.put(num, 1); } else { // 有就取出來加一 counts.put(num,counts.get(num) + 1); } } return counts; } } /** 時間複雜度:O(n)遍歷一遍陣列 空間複雜度:O(n) 藉助雜湊表記錄數字出現的個數 */