Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 697b8ac

Browse files
Merge branch 'master' of github.com:youngyangyang04/leetcode-master
2 parents ca4f55a + 7122ee5 commit 697b8ac

24 files changed

+844
-318
lines changed

‎problems/0005.最长回文子串.md‎

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -263,21 +263,38 @@ public:
263263
Java:
264264

265265
```java
266-
public int[] twoSum(int[] nums, int target) {
267-
int[] res = new int[2];
268-
if(nums == null || nums.length == 0){
269-
return res;
270-
}
271-
Map<Integer, Integer> map = new HashMap<>();
272-
for(int i = 0; i < nums.length; i++){
273-
int temp = target - nums[i];
274-
if(map.containsKey(temp)){
275-
res[1] = i;
276-
res[0] = map.get(temp);
266+
// 双指针 动态规划
267+
class Solution {
268+
public String longestPalindrome(String s) {
269+
if (s.length() == 0 || s.length() == 1) return s;
270+
int length = 1;
271+
int index = 0;
272+
boolean[][] palindrome = new boolean[s.length()][s.length()];
273+
for (int i = 0; i < s.length(); i++) {
274+
palindrome[i][i] = true;
275+
}
276+
277+
for (int L = 2; L <= s.length(); L++) {
278+
for (int i = 0; i < s.length(); i++) {
279+
int j = i + L - 1;
280+
if (j >= s.length()) break;
281+
if (s.charAt(i) != s.charAt(j)) {
282+
palindrome[i][j] = false;
283+
} else {
284+
if (j - i < 3) {
285+
palindrome[i][j] = true;
286+
} else {
287+
palindrome[i][j] = palindrome[i + 1][j - 1];
288+
}
289+
}
290+
if (palindrome[i][j] && j - i + 1 > length) {
291+
length = j - i + 1;
292+
index = i;
293+
}
294+
}
277295
}
278-
map.put(nums[i], i);
296+
return s.substring(index, index + length);
279297
}
280-
return res;
281298
}
282299
```
283300

@@ -363,6 +380,34 @@ class Solution:
363380
Go:
364381

365382
```go
383+
func longestPalindrome(s string) string {
384+
maxLen := 0
385+
left := 0
386+
length := 0
387+
dp := make([][]bool, len(s))
388+
for i := 0; i < len(s); i++ {
389+
dp[i] = make([]bool,len(s))
390+
}
391+
for i := len(s)-1; i >= 0; i-- {
392+
for j := i; j < len(s); j++ {
393+
if s[i] == s[j]{
394+
if j-i <= 1{ // 情况一和情况二
395+
length = j-i
396+
dp[i][j]=true
397+
}else if dp[i+1][j-1]{ // 情况三
398+
length = j-i
399+
dp[i][j] = true
400+
}
401+
}
402+
}
403+
if length > maxLen {
404+
maxLen = length
405+
left = i
406+
}
407+
}
408+
return s[left: left+maxLen+1]
409+
}
410+
366411

367412
```
368413

‎problems/0027.移除元素.md‎

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,18 +146,14 @@ public:
146146
};
147147
```
148148

149-
149+
150150
## 相关题目推荐
151151

152152
* 26.删除排序数组中的重复项
153153
* 283.移动零
154154
* 844.比较含退格的字符串
155155
* 977.有序数组的平方
156156

157-
158-
159-
160-
161157
## 其他语言版本
162158

163159

@@ -177,6 +173,26 @@ class Solution {
177173
}
178174
}
179175
```
176+
```java
177+
//相向双指针法
178+
class Solution {
179+
public int removeElement(int[] nums, int val) {
180+
int left = 0;
181+
int right = nums.length - 1;
182+
while(right >= 0 && nums[right] == val) right--; //将right移到从右数第一个值不为val的位置
183+
while(left <= right) {
184+
if(nums[left] == val) { //left位置的元素需要移除
185+
//将right位置的元素移到left(覆盖),right位置移除
186+
nums[left] = nums[right];
187+
right--;
188+
}
189+
left++;
190+
while(right >= 0 && nums[right] == val) right--;
191+
}
192+
return left;
193+
}
194+
}
195+
```
180196

181197
Python:
182198

‎problems/0035.搜索插入位置.md‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,32 @@ class Solution {
226226
}
227227
}
228228
```
229+
```java
230+
//第二种二分法:左闭右开
231+
public int searchInsert(int[] nums, int target) {
232+
int left = 0;
233+
int right = nums.length;
234+
while (left < right) { //左闭右开 [left, right)
235+
int middle = left + ((right - left) >> 1);
236+
if (nums[middle] > target) {
237+
right = middle; // target 在左区间,在[left, middle)中
238+
} else if (nums[middle] < target) {
239+
left = middle + 1; // target 在右区间,在 [middle+1, right)中
240+
} else { // nums[middle] == target
241+
return middle; // 数组中找到目标值的情况,直接返回下标
242+
}
243+
}
244+
// 目标值在数组所有元素之前 [0,0)
245+
// 目标值插入数组中的位置 [left, right) ,return right 即可
246+
// 目标值在数组所有元素之后的情况 [left, right),因为是右开区间,所以 return right
247+
return right;
248+
}
249+
```
250+
251+
252+
229253
Golang:
254+
230255
```golang
231256
// 第一种二分法
232257
func searchInsert(nums []int, target int) int {

‎problems/0051.N皇后.md‎

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -222,56 +222,6 @@ public:
222222

223223
## 其他语言补充
224224

225-
226-
### Python
227-
228-
```python
229-
class Solution:
230-
def solveNQueens(self, n: int) -> List[List[str]]:
231-
if not n: return []
232-
board = [['.'] * n for _ in range(n)]
233-
res = []
234-
def isVaild(board,row, col):
235-
#判断同一列是否冲突
236-
for i in range(len(board)):
237-
if board[i][col] == 'Q':
238-
return False
239-
# 判断左上角是否冲突
240-
i = row -1
241-
j = col -1
242-
while i>=0 and j>=0:
243-
if board[i][j] == 'Q':
244-
return False
245-
i -= 1
246-
j -= 1
247-
# 判断右上角是否冲突
248-
i = row - 1
249-
j = col + 1
250-
while i>=0 and j < len(board):
251-
if board[i][j] == 'Q':
252-
return False
253-
i -= 1
254-
j += 1
255-
return True
256-
257-
def backtracking(board, row, n):
258-
# 如果走到最后一行,说明已经找到一个解
259-
if row == n:
260-
temp_res = []
261-
for temp in board:
262-
temp_str = "".join(temp)
263-
temp_res.append(temp_str)
264-
res.append(temp_res)
265-
for col in range(n):
266-
if not isVaild(board, row, col):
267-
continue
268-
board[row][col] = 'Q'
269-
backtracking(board, row+1, n)
270-
board[row][col] = '.'
271-
backtracking(board, 0, n)
272-
return res
273-
```
274-
275225
### Java
276226

277227
```java
@@ -341,6 +291,55 @@ class Solution {
341291
}
342292
```
343293

294+
### Python
295+
296+
```python
297+
class Solution:
298+
def solveNQueens(self, n: int) -> List[List[str]]:
299+
if not n: return []
300+
board = [['.'] * n for _ in range(n)]
301+
res = []
302+
def isVaild(board,row, col):
303+
#判断同一列是否冲突
304+
for i in range(len(board)):
305+
if board[i][col] == 'Q':
306+
return False
307+
# 判断左上角是否冲突
308+
i = row -1
309+
j = col -1
310+
while i>=0 and j>=0:
311+
if board[i][j] == 'Q':
312+
return False
313+
i -= 1
314+
j -= 1
315+
# 判断右上角是否冲突
316+
i = row - 1
317+
j = col + 1
318+
while i>=0 and j < len(board):
319+
if board[i][j] == 'Q':
320+
return False
321+
i -= 1
322+
j += 1
323+
return True
324+
325+
def backtracking(board, row, n):
326+
# 如果走到最后一行,说明已经找到一个解
327+
if row == n:
328+
temp_res = []
329+
for temp in board:
330+
temp_str = "".join(temp)
331+
temp_res.append(temp_str)
332+
res.append(temp_res)
333+
for col in range(n):
334+
if not isVaild(board, row, col):
335+
continue
336+
board[row][col] = 'Q'
337+
backtracking(board, row+1, n)
338+
board[row][col] = '.'
339+
backtracking(board, 0, n)
340+
return res
341+
```
342+
344343

345344
### Go
346345
```Go
@@ -396,6 +395,8 @@ func isValid(n, row, col int, chessboard [][]string) bool {
396395
return true
397396
}
398397
```
398+
399+
399400
### Javascript
400401
```Javascript
401402
var solveNQueens = function(n) {

‎problems/0053.最大子序和(动态规划).md‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,20 @@ Java:
120120
return res;
121121
}
122122
```
123+
```Java
124+
//因为dp[i]的递推公式只与前一个值有关,所以可以用一个变量代替dp数组,空间复杂度为O(1)
125+
class Solution {
126+
public int maxSubArray(int[] nums) {
127+
int res = nums[0];
128+
int pre = nums[0];
129+
for(int i = 1; i < nums.length; i++) {
130+
pre = Math.max(pre + nums[i], nums[i]);
131+
res = Math.max(res, pre);
132+
}
133+
return res;
134+
}
135+
}
136+
```
123137

124138
Python:
125139
```python

‎problems/0054.螺旋矩阵.md‎

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,73 @@ public:
133133

134134
## 其他语言版本
135135

136+
### Java
137+
138+
```java
139+
class Solution {
140+
public List<Integer> spiralOrder(int[][] matrix) {
141+
//存放数组的数
142+
List<Integer> ans = new ArrayList<>();
143+
//列数
144+
int columns = matrix[0].length;
145+
//行数
146+
int rows = matrix.length;
147+
//遍历起点
148+
int start = 0;
149+
//循环的次数 行数和列数中的最小值除以二
150+
int loop = Math.min(rows,columns) / 2;
151+
//未遍历的中间列(行)的列(行)下标
152+
int mid = loop;
153+
//终止条件
154+
int offSet = 1;
155+
int i,j;
156+
while(loop-- > 0) {
157+
//初始化起点
158+
i = j = start;
159+
160+
//从左往右
161+
for(; j < columns - offSet; j++)
162+
ans.add(matrix[i][j]);
163+
164+
//从上往下
165+
for(; i < rows - offSet; i++)
166+
ans.add(matrix[i][j]);
167+
168+
//从右往左
169+
for(; j > start; j--)
170+
ans.add(matrix[i][j]);
171+
172+
//从下往上
173+
for(; i > start; i--)
174+
ans.add(matrix[i][j]);
175+
176+
//每循环一次 改变起点位置
177+
start++;
178+
//终止条件改变
179+
offSet++;
180+
}
181+
182+
//如果行和列中的最小值是奇数 则会产生中间行或者中间列没有遍历
183+
if(Math.min(rows,columns) % 2 != 0) {
184+
//行大于列则产生中间列
185+
if(rows > columns) {
186+
//中间列的行的最大下标的下一位的下标为mid + rows - columns + 1
187+
for(int k = mid; k < mid + rows - columns + 1; k++) {
188+
ans.add(matrix[k][mid]);
189+
}
190+
}else {//列大于等于行则产生中间行
191+
//中间行的列的最大下标的下一位的下标为mid + columns - rows + 1
192+
for(int k = mid; k < mid + columns - rows + 1; k++) {
193+
ans.add(matrix[mid][k]);
194+
}
195+
}
196+
}
197+
return ans;
198+
}
199+
}
200+
```
201+
202+
203+
136204
-----------------------
137205
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /