Skip to content

Commit 96724fc

Browse files
authored
feat: add solutions to lc problems: No.1389,1402 (doocs#1748)
* No.1389.Create Target Array in the Given Order * No.1402.Reducing Dishes
1 parent 2486ca5 commit 96724fc

File tree

12 files changed

+181
-124
lines changed

12 files changed

+181
-124
lines changed

solution/1300-1399/1389.Create Target Array in the Given Order/README.md

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ nums index target
6767

6868
<!-- 这里可写通用的实现逻辑 -->
6969

70+
**方法一:模拟**
71+
72+
我们创建一个列表 $target$,用于存储目标数组。由于题目保证数字插入位置总是存在,因此我们可以直接按照给定的顺序插入到对应的位置。
73+
74+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 是数组的长度。
75+
7076
<!-- tabs:start -->
7177

7278
### **Python3**
@@ -77,8 +83,8 @@ nums index target
7783
class Solution:
7884
def createTargetArray(self, nums: List[int], index: List[int]) -> List[int]:
7985
target = []
80-
for i in range(len(nums)):
81-
target.insert(index[i], nums[i])
86+
for x, i in zip(nums, index):
87+
target.insert(i, x)
8288
return target
8389
```
8490

@@ -94,27 +100,16 @@ class Solution {
94100
for (int i = 0; i < n; ++i) {
95101
target.add(index[i], nums[i]);
96102
}
97-
int[] res = new int[n];
103+
// return target.stream().mapToInt(i -> i).toArray();
104+
int[] ans = new int[n];
98105
for (int i = 0; i < n; ++i) {
99-
res[i] = target.get(i);
106+
ans[i] = target.get(i);
100107
}
101-
return res;
108+
return ans;
102109
}
103110
}
104111
```
105112

106-
### **TypeScript**
107-
108-
```ts
109-
function createTargetArray(nums: number[], index: number[]): number[] {
110-
const ans: number[] = [];
111-
for (let i = 0; i < nums.length; i++) {
112-
ans.splice(index[i], 0, nums[i]);
113-
}
114-
return ans;
115-
}
116-
```
117-
118113
### **C++**
119114

120115
```cpp
@@ -135,14 +130,26 @@ public:
135130
```go
136131
func createTargetArray(nums []int, index []int) []int {
137132
target := make([]int, len(nums))
138-
for i, v := range nums {
133+
for i, x := range nums {
139134
copy(target[index[i]+1:], target[index[i]:])
140-
target[index[i]] = v
135+
target[index[i]] = x
141136
}
142137
return target
143138
}
144139
```
145140

141+
### **TypeScript**
142+
143+
```ts
144+
function createTargetArray(nums: number[], index: number[]): number[] {
145+
const ans: number[] = [];
146+
for (let i = 0; i < nums.length; i++) {
147+
ans.splice(index[i], 0, nums[i]);
148+
}
149+
return ans;
150+
}
151+
```
152+
146153
### **...**
147154

148155
```

solution/1300-1399/1389.Create Target Array in the Given Order/README_EN.md

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ nums index target
7272
class Solution:
7373
def createTargetArray(self, nums: List[int], index: List[int]) -> List[int]:
7474
target = []
75-
for i in range(len(nums)):
76-
target.insert(index[i], nums[i])
75+
for x, i in zip(nums, index):
76+
target.insert(i, x)
7777
return target
7878
```
7979

@@ -87,27 +87,16 @@ class Solution {
8787
for (int i = 0; i < n; ++i) {
8888
target.add(index[i], nums[i]);
8989
}
90-
int[] res = new int[n];
90+
// return target.stream().mapToInt(i -> i).toArray();
91+
int[] ans = new int[n];
9192
for (int i = 0; i < n; ++i) {
92-
res[i] = target.get(i);
93+
ans[i] = target.get(i);
9394
}
94-
return res;
95+
return ans;
9596
}
9697
}
9798
```
9899

99-
### **TypeScript**
100-
101-
```ts
102-
function createTargetArray(nums: number[], index: number[]): number[] {
103-
const ans: number[] = [];
104-
for (let i = 0; i < nums.length; i++) {
105-
ans.splice(index[i], 0, nums[i]);
106-
}
107-
return ans;
108-
}
109-
```
110-
111100
### **C++**
112101

113102
```cpp
@@ -128,14 +117,26 @@ public:
128117
```go
129118
func createTargetArray(nums []int, index []int) []int {
130119
target := make([]int, len(nums))
131-
for i, v := range nums {
120+
for i, x := range nums {
132121
copy(target[index[i]+1:], target[index[i]:])
133-
target[index[i]] = v
122+
target[index[i]] = x
134123
}
135124
return target
136125
}
137126
```
138127

128+
### **TypeScript**
129+
130+
```ts
131+
function createTargetArray(nums: number[], index: number[]): number[] {
132+
const ans: number[] = [];
133+
for (let i = 0; i < nums.length; i++) {
134+
ans.splice(index[i], 0, nums[i]);
135+
}
136+
return ans;
137+
}
138+
```
139+
139140
### **...**
140141

141142
```
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
func createTargetArray(nums []int, index []int) []int {
22
target := make([]int, len(nums))
3-
for i, v := range nums {
3+
for i, x := range nums {
44
copy(target[index[i]+1:], target[index[i]:])
5-
target[index[i]] = v
5+
target[index[i]] = x
66
}
77
return target
88
}

solution/1300-1399/1389.Create Target Array in the Given Order/Solution.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ public int[] createTargetArray(int[] nums, int[] index) {
55
for (int i = 0; i < n; ++i) {
66
target.add(index[i], nums[i]);
77
}
8-
int[] res = new int[n];
8+
// return target.stream().mapToInt(i -> i).toArray();
9+
int[] ans = new int[n];
910
for (int i = 0; i < n; ++i) {
10-
res[i] = target.get(i);
11+
ans[i] = target.get(i);
1112
}
12-
return res;
13+
return ans;
1314
}
1415
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class Solution:
22
def createTargetArray(self, nums: List[int], index: List[int]) -> List[int]:
33
target = []
4-
for i in range(len(nums)):
5-
target.insert(index[i], nums[i])
4+
for x, i in zip(nums, index):
5+
target.insert(i, x)
66
return target

solution/1400-1499/1402.Reducing Dishes/README.md

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,17 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56-
**方法一:排序 + 贪心**
56+
**方法一:贪心 + 排序**
57+
58+
假如我们只选择一道菜,那么我们应该选择满意度最大的那道菜 $s_0$,并且判断 $s_0$ 是否大于 0,如果 $s_0 \leq 0$,那么我们就不做菜了,否则我们做这道菜,得到的总满意度为 $s_0$。
59+
60+
假如我们选择两道菜,那么我们应该选择满足度最大的两道菜 $s_0$ 和 $s_1$,满意度为 $s_1 + 2 \times s_0$,此时要保证选择之后的满意度大于选择之前的满意度,即 $s_1 + 2 \times s_0 > s_0$,即 只要满足 $s_1 + s_0 > 0$,我们就可以选择这两道菜。
61+
62+
依此类推,我们可以得到一个规律,即我们应该选择满意度最大的 $k$ 道菜,并且保证前 $k$ 道菜的满意度之和大于 $0$。
63+
64+
在实现上,我们可以先对所有菜的满意度进行排序,然后从满意度最大的菜开始选择,每次累加当前这道菜的满意度,如果累加的结果小于等于 $0$,那么我们就不再选择后面的菜了,否则我们就选择这道菜。
65+
66+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 是数组的长度。
5767

5868
<!-- tabs:start -->
5969

@@ -65,13 +75,12 @@
6575
class Solution:
6676
def maxSatisfaction(self, satisfaction: List[int]) -> int:
6777
satisfaction.sort(reverse=True)
68-
ans = presum = 0
69-
for v in satisfaction:
70-
presum += v
71-
if presum > 0:
72-
ans += presum
73-
else:
78+
ans = s = 0
79+
for x in satisfaction:
80+
s += x
81+
if s <= 0:
7482
break
83+
ans += s
7584
return ans
7685
```
7786

@@ -83,14 +92,13 @@ class Solution:
8392
class Solution {
8493
public int maxSatisfaction(int[] satisfaction) {
8594
Arrays.sort(satisfaction);
86-
int ans = 0, presum = 0;
95+
int ans = 0, s = 0;
8796
for (int i = satisfaction.length - 1; i >= 0; --i) {
88-
presum += satisfaction[i];
89-
if (presum > 0) {
90-
ans += presum;
91-
} else {
97+
s += satisfaction[i];
98+
if (s <= 0) {
9299
break;
93100
}
101+
ans += s;
94102
}
95103
return ans;
96104
}
@@ -104,13 +112,13 @@ class Solution {
104112
public:
105113
int maxSatisfaction(vector<int>& satisfaction) {
106114
sort(rbegin(satisfaction), rend(satisfaction));
107-
int ans = 0, presum = 0;
108-
for (int v : satisfaction) {
109-
presum += v;
110-
if (presum > 0)
111-
ans += presum;
112-
else
115+
int ans = 0, s = 0;
116+
for (int x : satisfaction) {
117+
s += x;
118+
if (s <= 0) {
113119
break;
120+
}
121+
ans += s;
114122
}
115123
return ans;
116124
}
@@ -120,18 +128,34 @@ public:
120128
### **Go**
121129
122130
```go
123-
func maxSatisfaction(satisfaction []int) int {
124-
sort.Ints(satisfaction)
125-
ans, presum := 0, 0
126-
for i := len(satisfaction) - 1; i >= 0; i-- {
127-
presum += satisfaction[i]
128-
if presum > 0 {
129-
ans += presum
130-
} else {
131+
func maxSatisfaction(satisfaction []int) (ans int) {
132+
sort.Slice(satisfaction, func(i, j int) bool { return satisfaction[i] > satisfaction[j] })
133+
s := 0
134+
for _, x := range satisfaction {
135+
s += x
136+
if s <= 0 {
131137
break
132138
}
139+
ans += s
133140
}
134-
return ans
141+
return
142+
}
143+
```
144+
145+
### **TypeScript**
146+
147+
```ts
148+
function maxSatisfaction(satisfaction: number[]): number {
149+
satisfaction.sort((a, b) => b - a);
150+
let [ans, s] = [0, 0];
151+
for (const x of satisfaction) {
152+
s += x;
153+
if (s <= 0) {
154+
break;
155+
}
156+
ans += s;
157+
}
158+
return ans;
135159
}
136160
```
137161

0 commit comments

Comments
 (0)