@@ -45,7 +45,15 @@ result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5。
45
45
46
46
<!-- 这里可写通用的实现逻辑 -->
47
47
48
- 前缀和实现。
48
+ ** 方法一:求和 + 枚举**
49
+
50
+ 我们记数组长度为 $n$,求出数组 ` nums ` 的所有元素之和,记为 $s$。
51
+
52
+ 然后枚举数组 ` nums ` 中的每个元素 ` nums[i] ` ,用变量 $t$ 记录 ` nums[i] ` 前面的元素之和。
53
+
54
+ 由于数组是非递减的,我们可以得到 $result[ i] = s - t - (n - i) \times nums[ i] + nums[ i] \times i - t$。
55
+
56
+ 遍历结束后,返回答案数组即可。
49
57
50
58
<!-- tabs:start -->
51
59
@@ -56,15 +64,14 @@ result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5。
56
64
``` python
57
65
class Solution :
58
66
def getSumAbsoluteDifferences (self , nums : List[int ]) -> List[int ]:
59
- n = len (nums)
60
- presum = [0 ] * (n + 1 )
61
- for i in range (n):
62
- presum[i + 1 ] = presum[i] + nums[i]
63
- res = []
64
- for i, num in enumerate (nums):
65
- t = num * i - presum[i] + presum[n] - presum[i + 1 ] - num * (n - i - 1 )
66
- res.append(t)
67
- return res
67
+ s = sum (nums)
68
+ t, n = 0 , len (nums)
69
+ ans = []
70
+ for i, v in enumerate (nums):
71
+ x = s - t - (n - i) * v + v * i - t
72
+ t += v
73
+ ans.append(x)
74
+ return ans
68
75
```
69
76
70
77
### ** Java**
@@ -74,16 +81,19 @@ class Solution:
74
81
``` java
75
82
class Solution {
76
83
public int [] getSumAbsoluteDifferences (int [] nums ) {
77
- int n = nums. length;
78
- int [] presum = new int [n + 1 ];
79
- for (int i = 0 ; i < n; ++ i) {
80
- presum[i + 1 ] = presum[i] + nums[i];
84
+ int s = 0 ;
85
+ for (int v : nums) {
86
+ s += v;
81
87
}
82
- int [] res = new int [n];
88
+ int t = 0 , n = nums. length;
89
+ int [] ans = new int [n];
83
90
for (int i = 0 ; i < n; ++ i) {
84
- res[i] = nums[i] * i - presum[i] + presum[n] - presum[i + 1 ] - nums[i] * (n - i - 1 );
91
+ int v = nums[i];
92
+ int x = s - t - (n - i) * v + v * i - t;
93
+ t += v;
94
+ ans[i] = x;
85
95
}
86
- return res ;
96
+ return ans ;
87
97
}
88
98
}
89
99
```
@@ -94,17 +104,16 @@ class Solution {
94
104
class Solution {
95
105
public:
96
106
vector<int > getSumAbsoluteDifferences(vector<int >& nums) {
97
- int n = nums.size();
98
- vector<int > presum(n + 1);
99
- for (int i = 0; i < n; ++i) {
100
- presum[ i + 1] = presum[ i] + nums[ i] ;
101
- }
102
- vector<int > res;
107
+ int s = accumulate(nums.begin(), nums.end(), 0);
108
+ int t = 0, n = nums.size();
109
+ vector<int > ans(n);
103
110
for (int i = 0; i < n; ++i) {
104
- int t = nums[ i] * i - presum[ i] + presum[ n] - presum[ i + 1] - nums[ i] * (n - i - 1);
105
- res.push_back(t);
111
+ int v = nums[ i] ;
112
+ int x = s - t - (n - i) * v + v * i - t;
113
+ t += v;
114
+ ans[ i] = x;
106
115
}
107
- return res ;
116
+ return ans ;
108
117
}
109
118
};
110
119
```
@@ -113,20 +122,46 @@ public:
113
122
114
123
```go
115
124
func getSumAbsoluteDifferences(nums []int) []int {
116
- n := len(nums)
117
- presum := make([]int, n+1)
118
- for i := 0; i < n; i++ {
119
- presum[i+1] = presum[i] + nums[i]
125
+ s := 0
126
+ for _, v := range nums {
127
+ s += v
120
128
}
121
- var res []int
122
- for i := 0; i < n; i++ {
123
- t := nums[i]*i - presum[i] + presum[n] - presum[i+1] - nums[i]*(n-i-1)
124
- res = append(res, t)
129
+ t, n := 0, len(nums)
130
+ ans := make([]int, n)
131
+ for i, v := range nums {
132
+ x := s - t - (n-i)*v + v*i - t
133
+ t += v
134
+ ans[i] = x
125
135
}
126
- return res
136
+ return ans
127
137
}
128
138
```
129
139
140
+ ### ** JavaScript**
141
+
142
+ ``` js
143
+ /**
144
+ * @param {number[]} nums
145
+ * @return {number[]}
146
+ */
147
+ var getSumAbsoluteDifferences = function (nums ) {
148
+ let s = 0 ;
149
+ for (const v of nums) {
150
+ s += v;
151
+ }
152
+ let t = 0 ;
153
+ const n = nums .length ;
154
+ const ans = [];
155
+ for (let i = 0 ; i < n; ++ i) {
156
+ const v = nums[i];
157
+ const x = s - t - (n - i) * v + v * i - t;
158
+ t += v;
159
+ ans .push (x);
160
+ }
161
+ return ans;
162
+ };
163
+ ```
164
+
130
165
### ** ...**
131
166
132
167
```
0 commit comments