LeetCode-陣列篇
阿新 • • 發佈:2021-12-21
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) 藉助雜湊表記錄數字出現的個數 */