swift 算法 简单99.数组中的K-diff数对

本文探讨了在给定整数数组中寻找不同k-diff数对的问题,提供了两种算法实现,包括排序和双指针技巧,以高效解决这一挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.

示例 1:

输入: [3, 1, 4, 1, 5], k = 2
输出: 2
解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个1,但我们只应返回不同的数对的数量。
示例 2:

输入:[1, 2, 3, 4, 5], k = 1
输出: 4
解释: 数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。
示例 3:

输入: [1, 3, 1, 5, 4], k = 0
输出: 1
解释: 数组中只有一个 0-diff 数对,(1, 1)。
注意:

数对 (i, j) 和数对 (j, i) 被算作同一数对。
数组的长度不超过10,000。
所有输入的整数的范围在 [-1e7, 1e7]。

解法:

 func findPairs(_ nums: [Int], _ k: Int) -> Int {
     //632ms 解法一
//         var nums = nums.sorted()

//         var a = [Int]()
//         var count = 0
//         for i in 0..<nums.count{
//             for j in i+1..<nums.count{
//                 if nums[j] - nums[i] == k && [nums[i], nums[j]] != a{
//                     count += 1
//                     a = [nums[i], nums[j]]
//                     break
//                 }
//                 if nums[j] - nums[i] > k{
//                     break
//                 }
//             }
//         }
//         return count
        //456ms 解法二
         var nums = nums.sorted()
        var array = [[Int]]()
        
        for item in 0..<nums.count {
            for j in item+1..<nums.count {
                if abs(nums[item] - nums[j]) == k{
                    array.append([nums[item],nums[j]])
                    break
                }
                if nums[j] - nums[item] > k {
                    break
                }
            }
        }
        
        for (index,_) in array.enumerated().reversed() {
            
            if index > 0 {
                let a1 = array[index]
                let a2 = array[index - 1]
                if a1[0] == a2[0] && a1[1] == a2[1] || a1[0] == a2[1] && a1[1] == a2[0] {
                    array.remove(at: index)
                }
            }
        }
        
        return array.count
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值