天天看點

LeetCode-219. 存在重複元素 II.(java)

一、前言🔥

👨‍🎓作者:bug菌

✏️部落格:​​CSDN​​、​​掘金​​等

💌公衆号:​​猿圈奇妙屋​​

🚫特别聲明:原創不易,轉載請附上原文出處連結和本文聲明,謝謝配合。

🙏版權聲明:文章裡可能部分文字或者圖檔來源于網際網路或者百度百科,如有侵權請聯系bug菌處理。

對于沒有工作或者即将失業要重新面試的小夥伴而言,bug菌想接着把上幾個月更新的專欄​​《每日一題LeetCode》​​給重新捯饬起來,隻為幫助小夥伴們,能順利上岸,收到自己心儀的offer,面試第一關, 就是算法題。因為我始終堅信,變強絕對不是一朝一夕,而是貴在長久堅持,持之以恒。是以,趕緊跟着bug菌的步伐卷起來吧⏰,變強從這一刻開始➕🧈。

       小夥伴們在批閱文章的過程中如果覺得文章對您有一絲絲幫助,還請别吝啬您手裡的贊呀,大膽的把文章點亮👍吧,您的點贊三連(收藏⭐️+關注👨‍🎓+留言📃)就是對bug菌我創作道路上最好的鼓勵與支援😘。時光不棄🏃🏻‍♀️,創作不停💕,加油☘️

二、題目描述🔥

題目:

        給你一個整數數組 nums 和一個整數 k ,判斷數組中是否存在兩個 不同的索引 i 和 j ,滿足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,傳回 true ;否則,傳回 false 。

具體請看如下示例:

示例 1:

輸入:nums = [1,2,3,1], k = 3

輸出:true

示例 2:

輸入:nums = [1,0,1,1], k = 1

輸出:true

示例 3:

輸入:nums = [1,2,3,1,2,3], k = 2

輸出:false

提示:

  • ​1 <= nums.length <= 10^5​

  • ​-10^9 <= nums[i] <= 10^9​

  • ​0 <= k <= 10^5​

題目來源:​​LeetCode原題位址​​

題目難度:⭐⭐⭐

三、思路分析🔥

​​217. 存在重複元素​​》,而今天這道是它的變種題,其實本質都是讓你找到符合的條件的值,是否滿足傳回true或false。

       而今天這道題,其實也比較簡單, 無非就是要滿足某些條件下是否存在該組i與j,存在傳回true,不存在傳回false。那我們最直接的做法肯定是可以暴力解題,不就是定義個嵌套for,然後隻需要滿足nums[j] == nums[i],就直接傳回,否則繼續周遊,直到周遊到,預設傳回false即可。這是最常想到的套路解題法。

       接下來我再講一種比較優雅些的,不是要尋找是否有滿足該條件的數組下标麼?那我們就可以通過一個map來逐一儲存數組不同的數,其中key是nums[index],value是index(數組下标)。如果map判斷已存在該key,則說明數組有相同的元素,滿足條件1了,接着驗證這兩數的數組下标值是否滿足小于等于k的條件即可。

       需要注意的是:如果不滿足小于k條件,直接更新map中nums[index]對應的value(隻記錄每個元素的最大下标如果在下标 i之前存在與 nums[i] 相等的元素,應該在這些元素中尋找最大的下标 j,判斷 i - j ≤k 是否成立即可。)

四、算法實作🔥

暴力法-AC代碼

具體算法代碼實作如下:

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int {
        
        //将條件帶入
        for(int i = 0;i<nums.length;i++) {
            for(int j = i+1;j<i+k+1&&j<nums.length;j++) {

                //滿足直接傳回。
                if(nums[j] == nums[i]){
                     return true;
                }
            }
        }
        return false;
    }
}      

哈希法-AC代碼

具體算法代碼實作如下:

class Solution {
        public boolean containsNearbyDuplicate(int[] nums, int {
            //定義一個map存放。
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();

            int length = nums.length;
            for (int i = 0; i < length; i++) {
                
                //取出目前周遊下的這個值
                int num = nums[i];

                //如果存在相同key,且判斷是否滿足條件
                if (map.containsKey(num) && i - map.get(num) <= k) {
                    return true;
                }
                
                //不滿足,存入map。
                map.put(num, i);
            }
            return false;
        }
    }      
LeetCode-219. 存在重複元素 II.(java)

五、總結🔥

暴力法-leetcode送出運作結果截圖如下:

LeetCode-219. 存在重複元素 II.(java)
LeetCode-219. 存在重複元素 II.(java)
  • 時間複雜度:O(n^2)。
  • 空間複雜度:O(n)。

暴力法-leetcode送出運作結果截圖如下:

LeetCode-219. 存在重複元素 II.(java)

複雜度分析:

  • 時間複雜度:O(n)。
  • 空間複雜度:O(n)。

       總結一下:對于這道題,其實解題思路還有一種,我是後邊看官解才知道的,滑動視窗的思路,這個大家感興趣可以去研究一下。

       再者,解題道路千萬條,歡迎小夥伴們腦洞大開,如果你們有啥更好的想法或者思路,歡迎評論區告訴我哦,大家一起互相借鑒互相學習,方能成長的更快。

       好啦,以上就是本期的所有内容啦,咱們下期見咯。

  六、熱門推薦🔥

  1. ​​leetcode-9.回文數​​
  2. ​​leetcode-1.兩數之和​​
  3. ​​leetcode-13.羅馬數字轉整數​​
  4. ​​leetcode-14.最長公共字首​​
  5. ​​leetcode-20.有效的括号​​
  6. ​​leetcode-21.合并兩個有序連結清單​​
  7. ​​leetcode-26. 删除有序數組中的重複項​​

七、文末🔥

​​《每日一題LeetCode》​​,帶着你一塊兒刷題,專欄每一篇都附帶詳細解法,手把手帶你解題。

        一個人刷可能會覺得很累很難堅持,但是一群人刷就會覺得它是一件很有意義的事兒,互相督促互相鼓勵,一起變強。

       我是bug菌,一名想走👣出大山改變命運的程式猿。接下來的路還很長,都等待着我們去突破、去挑戰。來吧,小夥伴們,我們一起加油!未來皆可期,fighting!

最後送大家兩句話,與諸君共勉!

☘️做你想做的人,沒有時間限制,隻要願意,什麼時候都可以start,

🍀你能從現在開始改變,也可以一成不變,這件事,沒有規矩可言,你可以活出最精彩的自己。

LeetCode-219. 存在重複元素 II.(java)

💌如果文章對您有所幫助,就請留下您的贊吧!(#^.^#);

💝如果喜歡bug菌分享的文章,就請給bug菌點個關注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果對文章有任何疑問,還請文末留言或者加群吧【QQ交流群:708072830】;