LeetCode 3452: Sum of Good Numbers (k-Offset Neighbor Comparison)
LeetCode 3452ArrayIndex CheckToday we solve LeetCode 3452 - Sum of Good Numbers.
Source: https://leetcode.com/problems/sum-of-good-numbers/
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 ansvar 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 >= 0 且 nums[i] <= nums[i-k],置 ok = false。
5)若 i+k < n 且 nums[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 ansvar 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