Skip to content

Commit 58d8540

Browse files
committed
feat: add solutions to lc problem: No.1685
No.1685.Sum of Absolute Differences in a Sorted Array
1 parent 0414bd6 commit 58d8540

File tree

7 files changed

+187
-103
lines changed

7 files changed

+187
-103
lines changed

solution/1600-1699/1685.Sum of Absolute Differences in a Sorted Array/README.md

+70-35
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,15 @@ result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5。
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

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+
遍历结束后,返回答案数组即可。
4957

5058
<!-- tabs:start -->
5159

@@ -56,15 +64,14 @@ result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5。
5664
```python
5765
class Solution:
5866
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
6875
```
6976

7077
### **Java**
@@ -74,16 +81,19 @@ class Solution:
7481
```java
7582
class Solution {
7683
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;
8187
}
82-
int[] res = new int[n];
88+
int t = 0, n = nums.length;
89+
int[] ans = new int[n];
8390
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;
8595
}
86-
return res;
96+
return ans;
8797
}
8898
}
8999
```
@@ -94,17 +104,16 @@ class Solution {
94104
class Solution {
95105
public:
96106
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);
103110
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;
106115
}
107-
return res;
116+
return ans;
108117
}
109118
};
110119
```
@@ -113,20 +122,46 @@ public:
113122
114123
```go
115124
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
120128
}
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
125135
}
126-
return res
136+
return ans
127137
}
128138
```
129139

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+
130165
### **...**
131166

132167
```

solution/1600-1699/1685.Sum of Absolute Differences in a Sorted Array/README_EN.md

+61-34
Original file line numberDiff line numberDiff line change
@@ -46,32 +46,34 @@ result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5.
4646
```python
4747
class Solution:
4848
def getSumAbsoluteDifferences(self, nums: List[int]) -> List[int]:
49-
n = len(nums)
50-
presum = [0] * (n + 1)
51-
for i in range(n):
52-
presum[i + 1] = presum[i] + nums[i]
53-
res = []
54-
for i, num in enumerate(nums):
55-
t = num * i - presum[i] + presum[n] - presum[i + 1] - num * (n - i - 1)
56-
res.append(t)
57-
return res
49+
s = sum(nums)
50+
t, n = 0, len(nums)
51+
ans = []
52+
for i, v in enumerate(nums):
53+
x = s - t - (n - i) * v + v * i - t
54+
t += v
55+
ans.append(x)
56+
return ans
5857
```
5958

6059
### **Java**
6160

6261
```java
6362
class Solution {
6463
public int[] getSumAbsoluteDifferences(int[] nums) {
65-
int n = nums.length;
66-
int[] presum = new int[n + 1];
67-
for (int i = 0; i < n; ++i) {
68-
presum[i + 1] = presum[i] + nums[i];
64+
int s = 0;
65+
for (int v : nums) {
66+
s += v;
6967
}
70-
int[] res = new int[n];
68+
int t = 0, n = nums.length;
69+
int[] ans = new int[n];
7170
for (int i = 0; i < n; ++i) {
72-
res[i] = nums[i] * i - presum[i] + presum[n] - presum[i + 1] - nums[i] * (n - i - 1);
71+
int v = nums[i];
72+
int x = s - t - (n - i) * v + v * i - t;
73+
t += v;
74+
ans[i] = x;
7375
}
74-
return res;
76+
return ans;
7577
}
7678
}
7779
```
@@ -82,17 +84,16 @@ class Solution {
8284
class Solution {
8385
public:
8486
vector<int> getSumAbsoluteDifferences(vector<int>& nums) {
85-
int n = nums.size();
86-
vector<int> presum(n + 1);
87-
for (int i = 0; i < n; ++i) {
88-
presum[i + 1] = presum[i] + nums[i];
89-
}
90-
vector<int> res;
87+
int s = accumulate(nums.begin(), nums.end(), 0);
88+
int t = 0, n = nums.size();
89+
vector<int> ans(n);
9190
for (int i = 0; i < n; ++i) {
92-
int t = nums[i] * i - presum[i] + presum[n] - presum[i + 1] - nums[i] * (n - i - 1);
93-
res.push_back(t);
91+
int v = nums[i];
92+
int x = s - t - (n - i) * v + v * i - t;
93+
t += v;
94+
ans[i] = x;
9495
}
95-
return res;
96+
return ans;
9697
}
9798
};
9899
```
@@ -101,20 +102,46 @@ public:
101102
102103
```go
103104
func getSumAbsoluteDifferences(nums []int) []int {
104-
n := len(nums)
105-
presum := make([]int, n+1)
106-
for i := 0; i < n; i++ {
107-
presum[i+1] = presum[i] + nums[i]
105+
s := 0
106+
for _, v := range nums {
107+
s += v
108108
}
109-
var res []int
110-
for i := 0; i < n; i++ {
111-
t := nums[i]*i - presum[i] + presum[n] - presum[i+1] - nums[i]*(n-i-1)
112-
res = append(res, t)
109+
t, n := 0, len(nums)
110+
ans := make([]int, n)
111+
for i, v := range nums {
112+
x := s - t - (n-i)*v + v*i - t
113+
t += v
114+
ans[i] = x
113115
}
114-
return res
116+
return ans
115117
}
116118
```
117119

120+
### **JavaScript**
121+
122+
```js
123+
/**
124+
* @param {number[]} nums
125+
* @return {number[]}
126+
*/
127+
var getSumAbsoluteDifferences = function (nums) {
128+
let s = 0;
129+
for (const v of nums) {
130+
s += v;
131+
}
132+
let t = 0;
133+
const n = nums.length;
134+
const ans = [];
135+
for (let i = 0; i < n; ++i) {
136+
const v = nums[i];
137+
const x = s - t - (n - i) * v + v * i - t;
138+
t += v;
139+
ans.push(x);
140+
}
141+
return ans;
142+
};
143+
```
144+
118145
### **...**
119146

120147
```
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
class Solution {
22
public:
33
vector<int> getSumAbsoluteDifferences(vector<int>& nums) {
4-
int n = nums.size();
5-
vector<int> presum(n + 1);
4+
int s = accumulate(nums.begin(), nums.end(), 0);
5+
int t = 0, n = nums.size();
6+
vector<int> ans(n);
67
for (int i = 0; i < n; ++i) {
7-
presum[i + 1] = presum[i] + nums[i];
8+
int v = nums[i];
9+
int x = s - t - (n - i) * v + v * i - t;
10+
t += v;
11+
ans[i] = x;
812
}
9-
vector<int> res;
10-
for (int i = 0; i < n; ++i) {
11-
int t = nums[i] * i - presum[i] + presum[n] - presum[i + 1] - nums[i] * (n - i - 1);
12-
res.push_back(t);
13-
}
14-
return res;
13+
return ans;
1514
}
1615
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
func getSumAbsoluteDifferences(nums []int) []int {
2-
n := len(nums)
3-
presum := make([]int, n+1)
4-
for i := 0; i < n; i++ {
5-
presum[i+1] = presum[i] + nums[i]
2+
s := 0
3+
for _, v := range nums {
4+
s += v
65
}
7-
var res []int
8-
for i := 0; i < n; i++ {
9-
t := nums[i]*i - presum[i] + presum[n] - presum[i+1] - nums[i]*(n-i-1)
10-
res = append(res, t)
6+
t, n := 0, len(nums)
7+
ans := make([]int, n)
8+
for i, v := range nums {
9+
x := s - t - (n-i)*v + v*i - t
10+
t += v
11+
ans[i] = x
1112
}
12-
return res
13+
return ans
1314
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
class Solution {
22
public int[] getSumAbsoluteDifferences(int[] nums) {
3-
int n = nums.length;
4-
int[] presum = new int[n + 1];
5-
for (int i = 0; i < n; ++i) {
6-
presum[i + 1] = presum[i] + nums[i];
3+
int s = 0;
4+
for (int v : nums) {
5+
s += v;
76
}
8-
int[] res = new int[n];
7+
int t = 0, n = nums.length;
8+
int[] ans = new int[n];
99
for (int i = 0; i < n; ++i) {
10-
res[i] = nums[i] * i - presum[i] + presum[n] - presum[i + 1] - nums[i] * (n - i - 1);
10+
int v = nums[i];
11+
int x = s - t - (n - i) * v + v * i - t;
12+
t += v;
13+
ans[i] = x;
1114
}
12-
return res;
15+
return ans;
1316
}
1417
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number[]}
4+
*/
5+
var getSumAbsoluteDifferences = function (nums) {
6+
let s = 0;
7+
for (const v of nums) {
8+
s += v;
9+
}
10+
let t = 0;
11+
const n = nums.length;
12+
const ans = [];
13+
for (let i = 0; i < n; ++i) {
14+
const v = nums[i];
15+
const x = s - t - (n - i) * v + v * i - t;
16+
t += v;
17+
ans.push(x);
18+
}
19+
return ans;
20+
};

0 commit comments

Comments
 (0)