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 算法合集地址