LeetCode筆記:219. Contains Duplicate II

問題:

Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the difference between i and j is at most k.

大意:

給出一個整型數組和一個整型數k,判斷數組中是否任何兩個不一樣的位置i和j,如果 nums[i] = nums[j] ,i和j的距離不大于k。

思路:

這道題看起來簡單,不過有很多陷阱,比如如果k = 0,那么無論數組如何都是錯的。如果數組中不存在一樣的兩個數,也是錯的。如果數組中存在多個一樣的同一個數,只要有最短的兩個的距離小于等于k就可以了等等,我把代碼縫縫補補后,還是在一個很長數組的測試用例下超時了。。。不過我用的是最直接的方法,看了看如果合理地使用一些數據結構,就會很方便,比如使用set,set集合的特性是里面不會出現兩個不一樣的數字,那么我們建立一個長度為k的set,用它來掃描整個數組,不斷地判斷新出現的數據能不能放進去,如果不能放進去,說明存在距離小于等于k的數據是有相等的,否則就可以放進去,當然set中的數據量如果超過k了就要同時把早先放進去的數據拿出來了,如果掃描過后都可以放進去和取出來,說明沒找到小于等于k的相等的數,那就錯了。

這道題有個地方不一樣在于,一般的題目都是碰到什么就返回false,都沒有false才返回true。而這道題卻是遇到什么則返回true,都沒有true,才返回false。

他山之石:

public boolean containsNearbyDuplicate(int[] nums, int k) {
        Set<Integer> set = new HashSet<Integer>();
        for(int i = 0; i < nums.length; i++){
            if(i > k) set.remove(nums[i-k-1]);
            if(!set.add(nums[i])) return true;
        }
        return false;
 }

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首頁

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,769評論 0 33
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,779評論 0 11
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,920評論 2 36
  • 【今日拆文】:內心強大的孩子,是什么樣子?作者:魚爸 武志紅 【感觸】:嘗試運用拆書幫的學習理念RIA將本次閱讀的...
    婉雯W閱讀 200評論 1 1