数组
前缀和
题目描述
给你一个下标从 0 开始的整数数组 nums
,请你找出一个下标从 0 开始的整数数组 answer
,其中:
answer.length == nums.length
answer[i] = |leftSum[i] - rightSum[i]|
其中:
leftSum[i]
是数组 nums
中下标 i
左侧元素之和。如果不存在对应的元素,leftSum[i] = 0
。
rightSum[i]
是数组 nums
中下标 i
右侧元素之和。如果不存在对应的元素,rightSum[i] = 0
。
返回数组 answer
。
示例 1:
输入: nums = [10,4,8,3]
输出: [15,1,11,22]
解释: 数组 leftSum 为 [0,10,14,22] 且数组 rightSum 为 [15,11,3,0] 。
数组 answer 为 [|0 - 15|,|10 - 11|,|14 - 3|,|22 - 0|] = [15,1,11,22] 。
示例 2:
输入: nums = [1]
输出: [0]
解释: 数组 leftSum 为 [0] 且数组 rightSum 为 [0] 。
数组 answer 为 [|0 - 0|] = [0] 。
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 105
解法
方法一:前缀和
我们定义变量 $left$ 表示数组 nums
中下标 $i$ 左侧元素之和,变量 $right$ 表示数组 nums
中下标 $i$ 右侧元素之和。初始时 $left = 0$, $right = \sum_{i = 0}^{n - 1} nums[i]$。
遍历数组 nums
,对于当前遍历到的数字 $x$,我们更新 $right = right - x$,此时 $left$ 和 $right$ 分别表示数组 nums
中下标 $i$ 左侧元素之和和右侧元素之和。我们将 $left$ 和 $right$ 的差的绝对值加入答案数组 ans
中,然后更新 $left = left + x$。
遍历完成后,返回答案数组 ans
即可。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 nums
的长度。
相似题目:
Python3 Java C++ Go TypeScript Rust C
class Solution :
def leftRigthDifference ( self , nums : List [ int ]) -> List [ int ]:
left , right = 0 , sum ( nums )
ans = []
for x in nums :
right -= x
ans . append ( abs ( left - right ))
left += x
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13 class Solution {
public int [] leftRigthDifference ( int [] nums ) {
int left = 0 , right = Arrays . stream ( nums ). sum ();
int n = nums . length ;
int [] ans = new int [ n ] ;
for ( int i = 0 ; i < n ; ++ i ) {
right -= nums [ i ] ;
ans [ i ] = Math . abs ( left - right );
left += nums [ i ] ;
}
return ans ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13 class Solution {
public :
vector < int > leftRigthDifference ( vector < int >& nums ) {
int left = 0 , right = accumulate ( nums . begin (), nums . end (), 0 );
vector < int > ans ;
for ( int & x : nums ) {
right -= x ;
ans . push_back ( abs ( left - right ));
left += x ;
}
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 func leftRigthDifference ( nums [] int ) ( ans [] int ) {
var left , right int
for _ , x := range nums {
right += x
}
for _ , x := range nums {
right -= x
ans = append ( ans , abs ( left - right ))
left += x
}
return
}
func abs ( x int ) int {
if x < 0 {
return - x
}
return x
}
function leftRigthDifference ( nums : number []) : number [] {
let left = 0 ,
right = nums . reduce (( a , b ) => a + b );
const ans : number [] = [];
for ( const x of nums ) {
right -= x ;
ans . push ( Math . abs ( left - right ));
left += x ;
}
return ans ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14 impl Solution {
pub fn left_rigth_difference ( nums : Vec < i32 > ) -> Vec < i32 > {
let mut left = 0 ;
let mut right = nums . iter (). sum :: < i32 > ();
nums . iter ()
. map ( | v | {
right -= v ;
let res = ( left - right ). abs ();
left += v ;
res
})
. collect ()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 /**
* Note: The returned array must be malloced, assume caller calls free().
*/
int * leftRigthDifference ( int * nums , int numsSize , int * returnSize ) {
int left = 0 ;
int right = 0 ;
for ( int i = 0 ; i < numsSize ; i ++ ) {
right += nums [ i ];
}
int * ans = malloc ( sizeof ( int ) * numsSize );
for ( int i = 0 ; i < numsSize ; i ++ ) {
right -= nums [ i ];
ans [ i ] = abs ( left - right );
left += nums [ i ];
}
* returnSize = numsSize ;
return ans ;
}
方法二
方法三