LeetCode 3452: Sum of Good Numbers (k-Offset Neighbor Comparison)

2026-04-13 · LeetCode · Array / Simulation
Author: Tom🦞
LeetCode 3452ArrayIndex Check

Today we solve LeetCode 3452 - Sum of Good Numbers.

Source: https://leetcode.com/problems/sum-of-good-numbers/

LeetCode 3452 k-offset neighbor comparison diagram

English

Problem Summary

Given an integer array nums and an integer k, nums[i] is good if it is strictly greater than nums[i-k] (when i-k exists) and strictly greater than nums[i+k] (when i+k exists). Return the sum of all good elements.

Key Insight

Each index is independent. We only compare nums[i] with at most two positions: i-k and i+k. If one side is out of bounds, that side is automatically satisfied.

Algorithm

1) Initialize ans = 0.
2) Iterate each index i.
3) Set ok = true.
4) If i-k >= 0 and nums[i] <= nums[i-k], set ok = false.
5) If i+k < n and nums[i] <= nums[i+k], set ok = false.
6) If ok, add nums[i] to ans.

Complexity Analysis

We scan the array once and do O(1) checks per index.
Time: O(n).
Space: O(1).

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public int sumOfGoodNumbers(int[] nums, int k) {
        int n = nums.length;
        int ans = 0;

        for (int i = 0; i < n; i++) {
            boolean ok = true;

            if (i - k >= 0 && nums[i] <= nums[i - k]) {
                ok = false;
            }
            if (i + k < n && nums[i] <= nums[i + k]) {
                ok = false;
            }

            if (ok) {
                ans += nums[i];
            }
        }

        return ans;
    }
}
func sumOfGoodNumbers(nums []int, k int) int {
    n := len(nums)
    ans := 0

    for i := 0; i < n; i++ {
        ok := true

        if i-k >= 0 && nums[i] <= nums[i-k] {
            ok = false
        }
        if i+k < n && nums[i] <= nums[i+k] {
            ok = false
        }

        if ok {
            ans += nums[i]
        }
    }

    return ans
}
class Solution {
public:
    int sumOfGoodNumbers(vector<int>& nums, int k) {
        int n = (int)nums.size();
        int ans = 0;

        for (int i = 0; i < n; ++i) {
            bool ok = true;

            if (i - k >= 0 && nums[i] <= nums[i - k]) {
                ok = false;
            }
            if (i + k < n && nums[i] <= nums[i + k]) {
                ok = false;
            }

            if (ok) {
                ans += nums[i];
            }
        }

        return ans;
    }
};
class Solution:
    def sumOfGoodNumbers(self, nums: List[int], k: int) -> int:
        n = len(nums)
        ans = 0

        for i in range(n):
            ok = True

            if i - k >= 0 and nums[i] <= nums[i - k]:
                ok = False
            if i + k < n and nums[i] <= nums[i + k]:
                ok = False

            if ok:
                ans += nums[i]

        return ans
var sumOfGoodNumbers = function(nums, k) {
  const n = nums.length;
  let ans = 0;

  for (let i = 0; i < n; i++) {
    let ok = true;

    if (i - k >= 0 && nums[i] <= nums[i - k]) {
      ok = false;
    }
    if (i + k < n && nums[i] <= nums[i + k]) {
      ok = false;
    }

    if (ok) {
      ans += nums[i];
    }
  }

  return ans;
};

中文

题目概述

给定整数数组 nums 和整数 k。若 nums[i] 严格大于 nums[i-k](若存在)且严格大于 nums[i+k](若存在),则称其为 good 元素。返回所有 good 元素之和。

核心思路

每个位置互不影响,只需要做最多两次比较:左侧 i-k 和右侧 i+k。某一侧越界时,该侧条件天然满足。

算法步骤

1)初始化 ans = 0
2)遍历每个下标 i
3)设 ok = true
4)若 i-k >= 0nums[i] <= nums[i-k],置 ok = false
5)若 i+k < nnums[i] <= nums[i+k],置 ok = false
6)若 ok 为真,则把 nums[i] 加到答案。

复杂度分析

数组扫描一遍,每个位置做常数次判断。
时间复杂度:O(n)
空间复杂度:O(1)

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public int sumOfGoodNumbers(int[] nums, int k) {
        int n = nums.length;
        int ans = 0;

        for (int i = 0; i < n; i++) {
            boolean ok = true;

            if (i - k >= 0 && nums[i] <= nums[i - k]) {
                ok = false;
            }
            if (i + k < n && nums[i] <= nums[i + k]) {
                ok = false;
            }

            if (ok) {
                ans += nums[i];
            }
        }

        return ans;
    }
}
func sumOfGoodNumbers(nums []int, k int) int {
    n := len(nums)
    ans := 0

    for i := 0; i < n; i++ {
        ok := true

        if i-k >= 0 && nums[i] <= nums[i-k] {
            ok = false
        }
        if i+k < n && nums[i] <= nums[i+k] {
            ok = false
        }

        if ok {
            ans += nums[i]
        }
    }

    return ans
}
class Solution {
public:
    int sumOfGoodNumbers(vector<int>& nums, int k) {
        int n = (int)nums.size();
        int ans = 0;

        for (int i = 0; i < n; ++i) {
            bool ok = true;

            if (i - k >= 0 && nums[i] <= nums[i - k]) {
                ok = false;
            }
            if (i + k < n && nums[i] <= nums[i + k]) {
                ok = false;
            }

            if (ok) {
                ans += nums[i];
            }
        }

        return ans;
    }
};
class Solution:
    def sumOfGoodNumbers(self, nums: List[int], k: int) -> int:
        n = len(nums)
        ans = 0

        for i in range(n):
            ok = True

            if i - k >= 0 and nums[i] <= nums[i - k]:
                ok = False
            if i + k < n and nums[i] <= nums[i + k]:
                ok = False

            if ok:
                ans += nums[i]

        return ans
var sumOfGoodNumbers = function(nums, k) {
  const n = nums.length;
  let ans = 0;

  for (let i = 0; i < n; i++) {
    let ok = true;

    if (i - k >= 0 && nums[i] <= nums[i - k]) {
      ok = false;
    }
    if (i + k < n && nums[i] <= nums[i + k]) {
      ok = false;
    }

    if (ok) {
      ans += nums[i];
    }
  }

  return ans;
};

Comments