網(wǎng)站首頁 編程語言 正文
一、題目描述
題目內(nèi)容:
題目示例:
題目解析:
1 <= nums.length <= 104
-107?<= nums[i] <= 107
0 <= k <= 107
二、思路分析
我們拿到本題,讀取題意要求在一組整數(shù)數(shù)組中,求出差值為k的數(shù)對對數(shù)k-diff。在思考如何解答該題之前,需要明確如下幾點(diǎn)細(xì)節(jié):
- nums數(shù)組元素都是整數(shù)
- 索引位置i與位置j,不能相等
- k-diff數(shù)對關(guān)系:nums[i] - nums[j] = k?->?nums[i] = nums[j] + k?-〉?nums[i] - k = nums[j]
- k-diff數(shù)對,存在相同數(shù)對情況,但結(jié)果只取1次
因此,我們的對題目中進(jìn)行詳細(xì)了解了,因?yàn)闀懦貜?fù)的數(shù)對,我們很容易想哈希表來構(gòu)建
方法一:構(gòu)建哈希表
根據(jù)上述思路,我們使用python代碼能快速實(shí)現(xiàn),代碼如下:
class Solution(object): def findPairs(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ ans = set() numset = set() for num in nums: if num - k in numset: ans.add(num-k) if num + k in numset: ans.add(num) numset.add(num) return len(ans)
- 數(shù)對中重復(fù)場景如示例一中差值為k=1,(1,3) & (3,1)視為一種情況,則要定義兩個哈希表來儲存
- 哈希表可以通過字典k-value或者集合set(),本題無需考慮索引關(guān)系定義ans,numset兩個集合
- 當(dāng) nums[i] > nums[j],則nums[j] = nums[i] - k在numset中,取最小的那一個則ans.add(nums[i]-k),
- 當(dāng) nuns[i] < nums[j],則nums[j] = nums[i] + k 在numset中,取較小的那一個則ans.add(nums[i])
方法二:雙指針
根據(jù)上述思路,使用python代碼實(shí)現(xiàn),代碼如下:
class Solution(object): def findPairs(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ nums.sort() ans = 0 j = 0 for i in range(len(nums)): if i == 0 or nums[i] != nums[i-1]: while j < len(nums) and (nums[j] < nums[i] + k or j <= i): j +=1 if j < len(nums) and nums[j] == nums[i] + k: ans +=1 return ans
- 首先對nums數(shù)組中的元素按照從低到高的順序排列
- 在遞增的數(shù)組中,由于雙指針 i!=j,因此i指針一定是小于j的
- 枚舉查找的判斷的條件 nums[j] < nums[i]+k,指針j則往后移動
- 當(dāng)nums[j] = nums[i] + k 時,則對數(shù)次數(shù)+1
三、總結(jié)
本題可以使用哈希方法要使用兩個哈希表,屬于犧牲空間換取效率。雙指針方法,雖然沒有用額外的空間,但是速度較于方法一慢一點(diǎn)。
我們用第一種方法,AC提交記錄如下:
- 時間復(fù)雜度O(n),n為nums長度
- 空間復(fù)雜度O(n),需要使用哈希表,n為nums長度
原文鏈接:https://juejin.cn/post/7109863191928602637
相關(guān)推薦
- 2022-07-21 nginx的禁止ip訪問的配置方法和不緩存html
- 2022-07-22 用C語言根據(jù)天數(shù)輸出對應(yīng)的年、月、日
- 2023-10-26 解決問題:NODE_ENV 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序,或者批處理文件
- 2022-08-10 python中ThreadPoolExecutor線程池和ProcessPoolExecutor進(jìn)程
- 2023-07-22 macos通過homebrew安裝多版本node
- 2022-06-19 WPF實(shí)現(xiàn)流光動畫特效_實(shí)用技巧
- 2023-02-27 Python使用Crypto庫實(shí)現(xiàn)加密解密的示例詳解_python
- 2022-05-02 Entity?Framework中執(zhí)行sql語句_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支