IOS 算法(基础篇) ----- 算术三元组的数目

2022-08-09  本文已影响0人  ShawnAlex

给你一个下标从 0 开始、严格递增 的整数数组 nums 和一个正整数 diff 。如果满足下述全部条件,则三元组 (i, j, k) 就是一个 算术三元组 :
i < j < k ,
nums[j] - nums[i] == diff 且
nums[k] - nums[j] == diff
返回不同 算术三元组 的数目。
其中:
3 <= nums.length <= 200
0 <= nums[i] <= 200
1 <= diff <= 50
nums 严格 递增

例子

输入: nums = [0,1,4,6,7,10], diff = 3
输出: 2
解释:
(1, 2, 4) 是算术三元组:7 - 4 == 3 且 4 - 1 == 3 。
(2, 4, 5) 是算术三元组:10 - 7 == 3 且 7 - 4 == 3 。
示例 2:

输入: nums = [4,5,6,7,8,9], diff = 2
输出: 2
解释:
(0, 2, 4) 是算术三元组:8 - 6 == 2 且 6 - 4 == 2 。
(1, 3, 5) 是算术三元组:9 - 7 == 2 且 7 - 5 == 2 。

解题思路

方法1. 遍历法

一次循环, 判断nums中是否含有 当前值, 当前值 + diff, 当前值 + diff * 2 即可

未翻译版
    func arithmeticTriplets(_ nums: [Int], _ diff: Int) -> Int {

        var res = 0
        for i in 0..<nums.count - 2 {
            if nums.contains(nums[i] + diff) && nums.contains(nums[i] + diff * 2) {
                res += 1
            }
        }
        return res

    }
翻译版
    func arithmeticTriplets(_ nums: [Int], _ diff: Int) -> Int {

        // 定义出现次数变量
        var res = 0

        // 遍历, 到 nums.count - 2 才行
        for i in 0..<nums.count - 2 {

            // 判断nums如果包含nums[i] + diff 和 nums[i] + diff * 2
            if nums.contains(nums[i] + diff) && nums.contains(nums[i] + diff * 2) {

                // 次数 + 1
                res += 1
            }
        }

        // 返回结果
        return res

    }

方法2. 哈希法

哈希表法, 以nums中 出现数字做Key, 1为value, 形成 哈希表
一次遍历nums, 判断nums[i] - diff, nums[i] - diff * 2 即可

未翻译版
    func arithmeticTriplets(_ nums: [Int], _ diff: Int) -> Int {

        var res = 0, temp = [nums[0] : 1, nums[1] : 1]
        for i in 2..<nums.count {
            if temp[nums[i] - diff] != nil && temp[nums[i] - diff * 2] != nil {   
                res += 1
            }
            temp[nums[i]] = 1
        }
        return res

    }
翻译版
    func arithmeticTriplets(_ nums: [Int], _ diff: Int) -> Int {

        // 定义出现次数变量, 定义哈希表temp 添加nums前2个元素, 
        // temp初始为 [nums[0] : 1, nums[1] : 1]
        var res = 0, temp = [nums[0] : 1, nums[1] : 1]
       
        // 遍历, 因为前2个元素已经加入
        for i in 2..<nums.count {

            // 如果哈希表存在 nums[i] - diff, nums[i] - diff * 2
            if temp[nums[i] - diff] != nil && temp[nums[i] - diff * 2] != nil { 

                // 结果 + 1  
                res += 1
            }

            // 新增键值对, 当前数字做`Key`, 1为`value`
            temp[nums[i]] = 1
        }

        // 返回结果
        return res

    }

题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址

上一篇下一篇

猜你喜欢

热点阅读