Skip to content

Commit 4abade0

Browse files
yanglbmebluesword12350
authored andcommitted
Merge pull request doocs#75 from KongJHong/master
Add Solution 066&&073 CPP
2 parents d4f77b9 + 347dd0c commit 4abade0

File tree

5 files changed

+372
-0
lines changed

5 files changed

+372
-0
lines changed
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int threeSumClosest(int[] nums, int target) {
3+
int result = nums[0]+nums[1]+nums[2];
4+
Arrays.sort(nums);
5+
for(int i = 0;i<nums.length-2;i++){
6+
int start = i+1,end=nums.length-1;
7+
while(start<end){
8+
int cache = nums[i]+nums[start]+nums[end];
9+
if(Math.abs(cache-target)<Math.abs(result-target)) result = cache;
10+
if(cache < target ) start++;
11+
else if(cache > target) end--;
12+
else return result;
13+
}
14+
}
15+
return result;
16+
}
17+
}

solution/066.Plus One/README.md

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
## 加一
2+
3+
### 问题描述
4+
5+
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
6+
7+
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
8+
9+
你可以假设除了整数 0 之外,这个整数不会以零开头。
10+
11+
```
12+
示例 1:
13+
输入: [1,2,3]
14+
输出: [1,2,4]
15+
解释: 输入数组表示数字 123。
16+
17+
示例 2:
18+
输入: [4,3,2,1]
19+
输出: [4,3,2,2]
20+
解释: 输入数组表示数字 4321。
21+
```
22+
23+
### 思路:
24+
1. 末尾加1,注意超过10的情况,要取余进1
25+
2. 前后关系式应该是`digits[i-1] = digits[i-1] + digits[i] / 10;`,即前一个元素的值应该是本身加上后一个元素的进位
26+
3. 若首元素>=10,则需要插入元素
27+
28+
```CPP
29+
class Solution {
30+
public:
31+
vector<int> plusOne(vector<int>& digits) {
32+
int len = digits.size();
33+
if(len == 0)return digits;
34+
digits[len-1]++;
35+
int num = digits[len - 1];
36+
for(int i = len - 1;i>=1;i--){
37+
digits[i-1] = digits[i-1] + digits[i]/10;
38+
digits[i] %= 10;
39+
}
40+
41+
if(digits[0] >= 10){
42+
digits.insert(digits.begin(),digits[0]/10);
43+
digits[1] = digits[1] % 10;
44+
}
45+
return digits;
46+
}
47+
};
48+
49+
```

solution/066.Plus One/Solution.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
vector<int> plusOne(vector<int>& digits) {
4+
int len = digits.size();
5+
if(len == 0)return digits;
6+
digits[len-1]++;
7+
int num = digits[len - 1];
8+
for(int i = len - 1;i>=1;i--){
9+
digits[i-1] = digits[i-1] + digits[i]/10;
10+
digits[i] %= 10;
11+
}
12+
13+
if(digits[0] >= 10){
14+
digits.insert(digits.begin(),digits[0]/10);
15+
digits[1] = digits[1] % 10;
16+
}
17+
return digits;
18+
}
19+
};
+174
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
2+
3+
```
4+
示例 1:
5+
输入:
6+
[
7+
[1,1,1],
8+
[1,0,1],
9+
[1,1,1]
10+
]
11+
输出:
12+
[
13+
[1,0,1],
14+
[0,0,0],
15+
[1,0,1]
16+
]
17+
示例 2:
18+
19+
输入:
20+
[
21+
[0,1,2,0],
22+
[3,4,5,2],
23+
[1,3,1,5]
24+
]
25+
输出:
26+
[
27+
[0,0,0,0],
28+
[0,4,5,0],
29+
[0,3,1,0]
30+
]
31+
```
32+
33+
### 进阶:
34+
一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
35+
36+
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
37+
38+
你能想出一个常数空间的解决方案吗?
39+
40+
### 思路1
41+
42+
1. 创建行列辅助数组,先遍历矩阵,定位元素是0的行列,分别加入行数组,列数组
43+
2. 从行数组中取出元素,整行置零;同理列数组
44+
45+
空间复杂度`O(m+n)`,而且分别进行处理和列处理时有重复操作
46+
47+
### 思路2(优化思路1)
48+
49+
1. 先检查首行首列有没有0,有的话设置bool标记
50+
2. 从第二行第二列开始遍历,如果发现有0,设置`matrix[i][0] = 0和matrix[0][j] = 0`,即把首行首列对应行列值设置为0
51+
3. 遍历首行首列,把值为0的行按行设置为0;列同理
52+
4. 查看标记位,看是否需要把首行首列设置为0
53+
54+
这种思路没有用额外的空间,但是时间复杂度和思路1一样,都有待解决重复操作的问题
55+
56+
整体好于思路1,时间复杂度比思路1稳定
57+
58+
### Solution1
59+
60+
```CPP
61+
class Solution {
62+
public:
63+
void setZeroes(vector<vector<int>>& matrix) {
64+
if(matrix.empty())return;
65+
//行数组,列数组
66+
int rowNum = matrix.size();
67+
int columnNum = matrix[0].size();
68+
vector<int> rowVec;
69+
vector<int> columnVec;
70+
71+
72+
for(int i = 0;i<rowNum;i++){
73+
for(int j = 0;j<columnNum;j++){
74+
if(matrix[i][j] == 0){
75+
auto iter = find(rowVec.begin(),rowVec.end(),i);
76+
if(iter == rowVec.end())rowVec.push_back(i);
77+
78+
iter = find(columnVec.begin(),columnVec.end(),j);
79+
if(iter == columnVec.end())columnVec.push_back(j);
80+
}
81+
}
82+
}
83+
84+
rowNum = rowVec.size();
85+
if(rowNum == 0)return;
86+
87+
int row;
88+
int column;
89+
90+
//行处理
91+
for(int i = 0;i<rowNum;i++){
92+
row = rowVec[i];
93+
for(int j = 0;j<columnNum;j++){
94+
matrix[row][j] = 0;
95+
}
96+
}
97+
98+
//列处理
99+
columnNum = columnVec.size();
100+
rowNum = matrix.size();
101+
for(int i = 0 ; i < columnNum;i++){
102+
column = columnVec[i];
103+
for(int j = 0;j<rowNum;j++){
104+
matrix[j][column] = 0;
105+
}
106+
}
107+
108+
}
109+
};
110+
```
111+
112+
### Solution 2
113+
114+
```CPP
115+
class Solution {
116+
public:
117+
void setZeroes(vector<vector<int>>& matrix) {
118+
if(matrix.empty()) return;
119+
int m = matrix.size();
120+
int n = matrix[0].size();
121+
bool row = false , column = false;
122+
123+
124+
for(int i = 0; i < m; i++)//判断第1列的0;
125+
{
126+
if(matrix[i][0] == 0)
127+
{
128+
column = true;
129+
break;
130+
}
131+
}
132+
for(int i = 0; i < n; i ++)//判断第1行的0;
133+
{
134+
if(matrix[0][i] == 0)
135+
{
136+
row = true;
137+
break;
138+
}
139+
}
140+
141+
for(int i = 1; i < m;i++)
142+
{
143+
for(int j = 1; j < n;j++)
144+
{
145+
if(matrix[i][j] == 0)
146+
{
147+
matrix[0][j] = 0;
148+
matrix[i][0] = 0;
149+
}
150+
}
151+
}
152+
for(int i = 1; i < m;i++)
153+
{
154+
for(int j = 1; j < n;j++)
155+
{
156+
if(matrix[i][0] == 0 || matrix[0][j] == 0)
157+
{
158+
matrix[i][j] = 0;
159+
}
160+
}
161+
}
162+
if(row)
163+
for(int i = 0; i < n;i++)
164+
matrix[0][i] = 0;
165+
if(column)
166+
for(int i = 0; i < m;i++)
167+
matrix[i][0] = 0;
168+
169+
return;
170+
171+
172+
}
173+
};
174+
```
+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
//Solution1
2+
class Solution {
3+
public:
4+
void setZeroes(vector<vector<int>>& matrix) {
5+
if(matrix.empty())return;
6+
//行数组,列数组
7+
int rowNum = matrix.size();
8+
int columnNum = matrix[0].size();
9+
vector<int> rowVec;
10+
vector<int> columnVec;
11+
12+
13+
for(int i = 0;i<rowNum;i++){
14+
for(int j = 0;j<columnNum;j++){
15+
if(matrix[i][j] == 0){
16+
auto iter = find(rowVec.begin(),rowVec.end(),i);
17+
if(iter == rowVec.end())rowVec.push_back(i);
18+
19+
iter = find(columnVec.begin(),columnVec.end(),j);
20+
if(iter == columnVec.end())columnVec.push_back(j);
21+
}
22+
}
23+
}
24+
25+
rowNum = rowVec.size();
26+
if(rowNum == 0)return;
27+
28+
int row;
29+
int column;
30+
31+
//行处理
32+
for(int i = 0;i<rowNum;i++){
33+
row = rowVec[i];
34+
for(int j = 0;j<columnNum;j++){
35+
matrix[row][j] = 0;
36+
}
37+
}
38+
39+
//列处理
40+
columnNum = columnVec.size();
41+
rowNum = matrix.size();
42+
for(int i = 0 ; i < columnNum;i++){
43+
column = columnVec[i];
44+
for(int j = 0;j<rowNum;j++){
45+
matrix[j][column] = 0;
46+
}
47+
}
48+
49+
}
50+
};
51+
52+
//---------------------------------------------------------------------
53+
//Solution2
54+
55+
class Solution {
56+
public:
57+
void setZeroes(vector<vector<int>>& matrix) {
58+
if(matrix.empty()) return;
59+
int m = matrix.size();
60+
int n = matrix[0].size();
61+
bool row = false , column = false;
62+
63+
64+
for(int i = 0; i < m; i++)//判断第1列的0;
65+
{
66+
if(matrix[i][0] == 0)
67+
{
68+
column = true;
69+
break;
70+
}
71+
}
72+
for(int i = 0; i < n; i ++)//判断第1行的0;
73+
{
74+
if(matrix[0][i] == 0)
75+
{
76+
row = true;
77+
break;
78+
}
79+
}
80+
81+
for(int i = 1; i < m;i++)
82+
{
83+
for(int j = 1; j < n;j++)
84+
{
85+
if(matrix[i][j] == 0)
86+
{
87+
matrix[0][j] = 0;
88+
matrix[i][0] = 0;
89+
}
90+
}
91+
}
92+
for(int i = 1; i < m;i++)
93+
{
94+
for(int j = 1; j < n;j++)
95+
{
96+
if(matrix[i][0] == 0 || matrix[0][j] == 0)
97+
{
98+
matrix[i][j] = 0;
99+
}
100+
}
101+
}
102+
if(row)
103+
for(int i = 0; i < n;i++)
104+
matrix[0][i] = 0;
105+
if(column)
106+
for(int i = 0; i < m;i++)
107+
matrix[i][0] = 0;
108+
109+
return;
110+
111+
112+
}
113+
};

0 commit comments

Comments
 (0)