Welcome to Subscribe On Youtube
3618. Split Array by Prime Indices
Description
You are given an integer array nums
.
Split nums
into two arrays A
and B
using the following rule:
- Elements at prime indices in
nums
must go into arrayA
. - All other elements must go into array
B
.
Return the absolute difference between the sums of the two arrays: \|sum(A) - sum(B)\|
.
Note: An empty array has a sum of 0.
Example 1:
Input: nums = [2,3,4]
Output: 1
Explanation:
- The only prime index in the array is 2, so
nums[2] = 4
is placed in arrayA
. - The remaining elements,
nums[0] = 2
andnums[1] = 3
are placed in arrayB
. sum(A) = 4
,sum(B) = 2 + 3 = 5
.- The absolute difference is
\|4 - 5\| = 1
.
Example 2:
Input: nums = [-1,5,7,0]
Output: 3
Explanation:
- The prime indices in the array are 2 and 3, so
nums[2] = 7
andnums[3] = 0
are placed in arrayA
. - The remaining elements,
nums[0] = -1
andnums[1] = 5
are placed in arrayB
. sum(A) = 7 + 0 = 7
,sum(B) = -1 + 5 = 4
.- The absolute difference is
\|7 - 4\| = 3
.
Constraints:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
Solutions
Solution 1: Sieve of Eratosthenes + Simulation
We can use the Sieve of Eratosthenes to preprocess all prime numbers in the range $[0, 10^5]$. Then we iterate through the array $\textit{nums}$. For $\textit{nums}[i]$, if $i$ is a prime number, we add $\textit{nums}[i]$ to the answer; otherwise, we add $-\textit{nums}[i]$ to the answer. Finally, we return the absolute value of the answer.
Ignoring the preprocessing time and space, the time complexity is $O(n)$, where $n$ is the length of the array $\textit{nums}$, and the space complexity is $O(1)$.
-
class Solution { private static final int M = 100000 + 10; private static boolean[] primes = new boolean[M]; static { for (int i = 0; i < M; i++) { primes[i] = true; } primes[0] = primes[1] = false; for (int i = 2; i < M; i++) { if (primes[i]) { for (int j = i + i; j < M; j += i) { primes[j] = false; } } } } public long splitArray(int[] nums) { long ans = 0; for (int i = 0; i < nums.length; ++i) { ans += primes[i] ? nums[i] : -nums[i]; } return Math.abs(ans); } }
-
const int M = 1e5 + 10; bool primes[M]; auto init = [] { memset(primes, true, sizeof(primes)); primes[0] = primes[1] = false; for (int i = 2; i < M; ++i) { if (primes[i]) { for (int j = i + i; j < M; j += i) { primes[j] = false; } } } return 0; }(); class Solution { public: long long splitArray(vector<int>& nums) { long long ans = 0; for (int i = 0; i < nums.size(); ++i) { ans += primes[i] ? nums[i] : -nums[i]; } return abs(ans); } };
-
m = 10**5 + 10 primes = [True] * m primes[0] = primes[1] = False for i in range(2, m): if primes[i]: for j in range(i + i, m, i): primes[j] = False class Solution: def splitArray(self, nums: List[int]) -> int: return abs(sum(x if primes[i] else -x for i, x in enumerate(nums)))
-
const M = 100000 + 10 var primes [M]bool func init() { for i := 0; i < M; i++ { primes[i] = true } primes[0], primes[1] = false, false for i := 2; i < M; i++ { if primes[i] { for j := i + i; j < M; j += i { primes[j] = false } } } } func splitArray(nums []int) (ans int64) { for i, num := range nums { if primes[i] { ans += int64(num) } else { ans -= int64(num) } } return max(ans, -ans) }
-
const M = 100000 + 10; const primes: boolean[] = Array(M).fill(true); const init = (() => { primes[0] = primes[1] = false; for (let i = 2; i < M; i++) { if (primes[i]) { for (let j = i + i; j < M; j += i) { primes[j] = false; } } } })(); function splitArray(nums: number[]): number { let ans = 0; for (let i = 0; i < nums.length; i++) { ans += primes[i] ? nums[i] : -nums[i]; } return Math.abs(ans); }