Welcome to Subscribe On Youtube
3969. Valid Subarrays With Matching Sum Digits I
Description
You are given an integer array nums and an integer digit x.
A subarray nums[l..r] is considered valid if the sum of its elements satisfies both of the following conditions:
- The first digit of the sum is equal to
x. - The last digit of the sum is equal to
x.
Return the number of valid subarrays.
Example 1:
Input: nums = [1,100,1], x = 1
Output: 4
Explanation:
The valid subarrays are:
nums[0..0]:sum = 1nums[0..1]:sum = 1 + 100 = 101nums[1..2]:sum = 100 + 1 = 101nums[2..2]:sum = 1
Thus, the answer is 4.
Example 2:
Input: nums = [1], x = 2
Output: 0
Explanation:
The only subarray is nums[0..0] with a sum of 1, which does not satisfy the conditions.
Thus, the answer is 0.
Constraints:
1 <= nums.length <= 15001 <= nums[i] <= 1091 <= x <= 9
Solutions
Solution 1: Enumeration
We can enumerate the left endpoint $l$ of the subarray, and for each $l$, we enumerate the right endpoint $r$ in the range $[l, n)$, and calculate the sum of $nums[l..r]$. If it satisfies the conditions, the answer is increased by one.
The time complexity is $O(n^2)$, and the space complexity is $O(1)$. Here, $n$ is the length of the array $nums$.
-
class Solution { public int countValidSubarrays(int[] nums, int x) { int n = nums.length; int ans = 0; for (int l = 0; l < n; l++) { long s = 0; for (int r = l; r < n; r++) { s += nums[r]; if (s % 10 == x && Long.toString(s).charAt(0) - '0' == x) { ans++; } } } return ans; } } -
class Solution { public: int countValidSubarrays(vector<int>& nums, int x) { int n = nums.size(); int ans = 0; for (int l = 0; l < n; ++l) { long long s = 0; for (int r = l; r < n; ++r) { s += nums[r]; if (s % 10 == x && to_string(s)[0] - '0' == x) { ++ans; } } } return ans; } }; -
class Solution: def countValidSubarrays(self, nums: list[int], x: int) -> int: n = len(nums) ans = 0 for l in range(n): s = 0 for r in range(l, n): s += nums[r] if s % 10 == x and int(str(s)[0]) == x: ans += 1 return ans -
func countValidSubarrays(nums []int, x int) (ans int) { n := len(nums) for l := 0; l < n; l++ { var s int64 for r := l; r < n; r++ { s += int64(nums[r]) if s%10 == int64(x) && int(strconv.FormatInt(s, 10)[0]-'0') == x { ans++ } } } return } -
function countValidSubarrays(nums: number[], x: number): number { const n = nums.length; let ans = 0; for (let l = 0; l < n; l++) { let s = 0; for (let r = l; r < n; r++) { s += nums[r]; if (s % 10 === x && Number(s.toString()[0]) === x) { ans++; } } } return ans; }