当前位置: 面试刷题>> 回旋镖的数量 (经典算法题500道)


题目描述补充

题目:回旋镖的数量

给定一个整数数组nums,其中nums[i]表示第i个点的坐标(在一个二维平面上,这些点都在x轴上),你需要找出所有满足以下条件的回旋镖数量:

  1. 长度为3的子数组(i, j, k),其中i < j < k
  2. |nums[j] - nums[i]| = |nums[k] - nums[j]|,即j点距离i点的距离等于k点距离j点的距离。

注意:这里的距离是指两点之间在x轴上的差的绝对值。

示例

输入: nums = [1, 1, 1, 2, 2, 2, 3]

输出: 6

解释: 满足条件的回旋镖有(0, 1, 2), (0, 2, 4), (1, 2, 4), (2, 3, 5), (2, 4, 5), (4, 5, 6)

解题思路

这个问题可以通过遍历数组,并使用哈希表来记录每个差值的出现次数来解决。对于每个nums[j],我们计算它与前面所有点的差值(nums[j] - nums[i]),并记录在哈希表中。然后,当我们遍历到nums[k]时,我们再次计算差值nums[k] - nums[j],并查找哈希表中这个差值出现的次数(注意要排除自己与自己相减的情况)。最后,我们将这个次数加到结果中,并更新哈希表中nums[j] - nums[i]的计数。

PHP 示例代码

function numberOfBoomerangs($nums) {
    $count = 0;
    $n = count($nums);
    for ($j = 1; $j < $n - 1; $j++) {
        $diffCount = array();
        for ($i = 0; $i < $j; $i++) {
            $diff = $nums[$j] - $nums[$i];
            if (!isset($diffCount[$diff])) {
                $diffCount[$diff] = 0;
            }
            $diffCount[$diff]++;
        }
        
        for ($k = $j + 1; $k < $n; $k++) {
            $diff = $nums[$k] - $nums[$j];
            if (isset($diffCount[$diff]) && $diffCount[$diff] > 0) {
                $count += $diffCount[$diff];
            }
        }
    }
    
    return $count;
}

// 示例用法
$nums = [1, 1, 1, 2, 2, 2, 3];
echo numberOfBoomerangs($nums);  // 输出 6

Python 示例代码

def numberOfBoomerangs(nums):
    count = 0
    n = len(nums)
    for j in range(1, n - 1):
        diff_count = {}
        for i in range(j):
            diff = nums[j] - nums[i]
            if diff not in diff_count:
                diff_count[diff] = 0
            diff_count[diff] += 1
        
        for k in range(j + 1, n):
            diff = nums[k] - nums[j]
            if diff in diff_count and diff_count[diff] > 0:
                count += diff_count[diff]
    
    return count

# 示例用法
nums = [1, 1, 1, 2, 2, 2, 3]
print(numberOfBoomerangs(nums))  # 输出 6

JavaScript 示例代码

function numberOfBoomerangs(nums) {
    let count = 0;
    const n = nums.length;
    for (let j = 1; j < n - 1; j++) {
        const diffCount = {};
        for (let i = 0; i < j; i++) {
            const diff = nums[j] - nums[i];
            if (!diffCount[diff]) {
                diffCount[diff] = 0;
            }
            diffCount[diff]++;
        }
        
        for (let k = j + 1; k < n; k++) {
            const diff = nums[k] - nums[j];
            if (diffCount[diff] > 0) {
                count += diffCount[diff];
            }
        }
    }
    
    return count;
}

// 示例用法
const nums = [1, 1, 1, 2, 2, 2, 3];
console.log(numberOfBoomerangs(nums));  // 输出 6

码小课:希望以上内容能帮助到你,码小课网站中有更多相关算法和数据结构的内容,欢迎大家学习交流!

推荐面试题