前缀和 
      
    
      
      
      
        数组 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
    
题目描述 
给你一个下标从 0  开始的长度为 n 的整数数组 nums。
定义两个数组 leftSum 和 rightSum,其中:
    leftSum[i] 是数组 nums 中下标 i 左侧元素之和。如果不存在对应的元素,leftSum[i] = 0 。 
    rightSum[i] 是数组 nums 中下标 i 右侧元素之和。如果不存在对应的元素,rightSum[i] = 0 。 
 
返回长度为 n 数组 answer,其中 answer[i] = |leftSum[i] - rightSum[i]|。
 
示例 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 ; 
} 
 
 
 
 
方法二 
方法三