LeetCode、217存在重複元素

這是我參與更文挑戰的第2天,活動詳情查看: 更文挑戰前端

前言

受「王魚」同窗的點撥,從昨天開始刷LeetCode Top精選面試題,爲衝擊秋招作準備。面試

題目描述

給定一個整數數組,判斷是否存在重複元素。算法

若是存在一值在數組中出現至少兩次,函數返回 true 。若是數組中每一個元素都不相同,則返回 false 。數組

示例 1:markdown

輸入: [1,2,3,1] 輸出: true前端工程師

示例 2:app

輸入: [1,2,3,4] 輸出: false函數

示例 3:post

輸入: [1,1,1,3,3,4,3,2,4,2] 輸出: true學習

玩一下~

解題思路:數組轉Set去重。Set的size 和數組length相等,無重複元素。不等,有重複元素

var containsDuplicate = function(nums) {
    return new Set(nums).size !== nums.length
};
複製代碼

哈哈哈,有人說你這是什麼啊,我也會,別急,先熱個身嘛,來,力扣刷刷的思路雖遲但到~

排序

解題思路:在對數字從小到大排序以後。數組的重複元素必定出如今相鄰的位置,所以咱們能夠掃描已經排序的數組,每次判斷相鄰的兩個元素是否相等,若是相等則說明存在重複的元素。

var containsDuplicate = function(nums) {
  // 將數組作升序排列
  nums.sort((a, b) => a - b);
  // 數組的長度
  const n = nums.length;
  // 循環遍歷數組 由於下面須要有 i+1的操做,因此這裏n-1是取不到的。
  for (let i = 0; i < n - 1; i++) {
    if (nums[i] === nums[i + 1]) {
      return true;
    }
  }
  return false;
};
// 時間複雜度: O(NlogN),其中N爲數組的長度。須要對數組進行排序。
// 空間複雜度: O(logN),其中N爲數組的長度,注意在這裏咱們應當考慮遞歸調用棧的深度
複製代碼

哈希map

解題思路:對於數組中的每一個元素,咱們將它插入到哈希表中,若是插入一個元素的時候發現這個元素已經存在於哈希表中,則說明存在重複的元素。

var containsDuplicate = function(nums) {
 const map = new  Map()
 for(let i of nums) {
     if(map.has(i)){
         return true
     } else {
         map.set(i,1)
     }
 }
 return false
};
// 時間複雜度:O(N),其中 N爲數組的長度。
// 空間複雜度:O(N),其中 N爲數組的長度。
複製代碼

今日加餐

今日加餐我選擇了LeetCode13六、只出現一次的數,兩個一塊兒恰,味道更好嗷~

給定一個非空整數數組,除了某個元素只出現一次之外,其他每一個元素均出現兩次。找出那個只出現了一次的元素。

var singleNumber = function(nums) {
    //法1 排序後 先後比較
    nums.sort((a,b) => a - b);
    for(let i = 0; i < nums.length; i++){
        if(nums[i-1] !== nums[i] && nums[i] !== nums[i+1]) 
        return nums[i];
    }
    
    //法2 利用map
    let map = new Map();
    nums.forEach(item =>{
        map.set(item, map.has(item) ? map.get(item) + 1 : 1);
    })
    for(let [key, val] of map.entries()){
        if(val === 1) return key;
    }

    //法3 異或運算 
    return nums.reduce((pre,cur) => pre ^ cur);
};
複製代碼

npy:法3的異或看不懂哇!!!

me:好好好,來給你講解一下,而後給你說一下簡單的思路哈~

首先針對異或運算,這裏作一個知識點的總結:

任何數和本身作異或運算,結果爲 00,即 a⊕a=0a⊕a=0 。 任何數和 00 作異或運算,結果仍是本身,即 a⊕0=⊕a⊕0=⊕。 異或運算中,知足交換律和結合律,也就是 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=ba⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

var singleNumber = function(nums) {
    let ans = 0;
    for(let i = 0; i < nums.length; i++){
        ans ^= nums[i];
    }
    return ans;
};
複製代碼

總結

刷題打卡第8天,選擇力扣第21七、136題,學習了數組中的一個元素或者重複元素,一塊兒加油哇~

❤️ 感謝你們

若是你以爲這篇內容對你挺有有幫助的話: 點贊支持下吧,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)關注公衆號給npy的前端祕籍,咱們一塊兒學習一塊兒進步。 以爲不錯的話,也能夠閱讀其餘文章(感謝朋友的鼓勵與支持🌹🌹🌹)

開啓LeetCode之旅

LeetCode之雙指針

Leet2七、移除元素

前端工程師必學的經典排序算法

LeetCode20、括號匹配

LeetCode七、整數反轉

LeetCode34四、反轉字符串

相關文章
相關標籤/搜索