mirror of
https://github.com/chefyuan/algorithm-base.git
synced 2026-03-10 20:04:44 +00:00
添加Go语言题解
This commit is contained in:
@@ -260,3 +260,48 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func longestSubarray(nums []int, limit int) int {
|
||||
maxdeq := []int{} // 递减队列
|
||||
mindeq := []int{} // 递增队列
|
||||
|
||||
length := len(nums)
|
||||
left, right, maxwin := 0, 0, 0
|
||||
for right < length {
|
||||
for len(maxdeq) != 0 && maxdeq[len(maxdeq) - 1] < nums[right] {
|
||||
maxdeq = maxdeq[: len(maxdeq) - 1]
|
||||
}
|
||||
maxdeq = append(maxdeq, nums[right])
|
||||
|
||||
for len(mindeq) != 0 && mindeq[len(mindeq) - 1] > nums[right] {
|
||||
mindeq = mindeq[: len(mindeq) - 1]
|
||||
}
|
||||
mindeq = append(mindeq, nums[right])
|
||||
|
||||
for maxdeq[0] - mindeq[0] > limit {
|
||||
if maxdeq[0] == nums[left] {
|
||||
maxdeq = maxdeq[1:]
|
||||
}
|
||||
if mindeq[0] == nums[left] {
|
||||
mindeq = mindeq[1:]
|
||||
}
|
||||
left++
|
||||
}
|
||||
maxwin = max(maxwin, right - left + 1)
|
||||
right++
|
||||
}
|
||||
return maxwin
|
||||
}
|
||||
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -202,3 +202,20 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func twoSum(nums []int, target int) []int {
|
||||
m := make(map[int]int)
|
||||
for i, num := range nums {
|
||||
if v, ok := m[target - num]; ok {
|
||||
return []int{v, i}
|
||||
}
|
||||
m[num] = i
|
||||
}
|
||||
return []int{}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ class Solution {
|
||||
if (map.containsKey(nums[i])) {
|
||||
//判断是否小于K,如果小于等于则直接返回
|
||||
int abs = Math.abs(i - map.get(nums[i]));
|
||||
if (abs <= k) return true;//小于等于则返回
|
||||
if (abs <= k) return true;//小于等于则返回
|
||||
}
|
||||
//更新索引,此时有两种情况,不存在,或者存在时,将后出现的索引保存
|
||||
map.put(nums[i],i);
|
||||
@@ -72,7 +72,7 @@ class Solution:
|
||||
# 判断是否小于K,如果小于等于则直接返回
|
||||
a = abs(i - m[nums[i]])
|
||||
if a <= k:
|
||||
return True# 小于等于则返回
|
||||
return True# 小于等于则返回
|
||||
# 更新索引,此时有两种情况,不存在,或者存在时,将后出现的索引保存
|
||||
m[nums[i]] = i
|
||||
return False
|
||||
@@ -222,3 +222,25 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func containsNearbyDuplicate(nums []int, k int) bool {
|
||||
length := len(nums)
|
||||
if length == 0 {
|
||||
return false
|
||||
}
|
||||
m := map[int]int{}
|
||||
for i := 0; i < length; i++ {
|
||||
if v, ok := m[nums[i]]; ok {
|
||||
if i - v <= k {
|
||||
return true
|
||||
}
|
||||
}
|
||||
m[nums[i]] = i
|
||||
}
|
||||
return false
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -182,3 +182,25 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func removeElement(nums []int, val int) int {
|
||||
length := len(nums)
|
||||
if length == 0 {
|
||||
return 0
|
||||
}
|
||||
i := 0
|
||||
for j := 0; j < length; j++ {
|
||||
if nums[j] == val {
|
||||
continue
|
||||
}
|
||||
nums[i] = nums[j]
|
||||
i++
|
||||
}
|
||||
return i
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -273,3 +273,28 @@ public:
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func firstMissingPositive(nums []int) int {
|
||||
length := len(nums)
|
||||
if length == 0 { return 1 }
|
||||
for i := 0; i < length; i++ {
|
||||
// 将不在正确位置的元素放在正确的位置上。
|
||||
for nums[i] > 0 && nums[i] < length + 1 && nums[i] != i + 1 && nums[i] != nums[nums[i] - 1] {
|
||||
j := nums[i] - 1
|
||||
nums[i], nums[j] = nums[j], nums[i]
|
||||
}
|
||||
}
|
||||
// 第一个不在正确位置上的元素就是结果。
|
||||
for i := 0; i < length; i++ {
|
||||
if nums[i] != i + 1 {
|
||||
return i + 1
|
||||
}
|
||||
}
|
||||
return length + 1
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
下面我们通过一个视频模拟代码执行步骤大家一下就能搞懂了。
|
||||
|
||||

|
||||

|
||||
|
||||
下面我们直接看代码吧
|
||||
|
||||
@@ -207,3 +207,28 @@ public:
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func findMaxConsecutiveOnes(nums []int) int {
|
||||
cnt, maxCnt := 0, 0
|
||||
for i := 0; i < len(nums); i++ {
|
||||
if nums[i] == 1 {
|
||||
cnt++
|
||||
} else {
|
||||
maxCnt = max(maxCnt, cnt)
|
||||
cnt = 0
|
||||
}
|
||||
}
|
||||
return max(maxCnt, cnt)
|
||||
}
|
||||
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -180,3 +180,42 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func spiralOrder(matrix [][]int) []int {
|
||||
res := []int{}
|
||||
left, right := 0, len(matrix[0]) - 1
|
||||
top, down := 0, len(matrix) - 1
|
||||
|
||||
for {
|
||||
for i := left; i <= right; i++ {
|
||||
res = append(res, matrix[top][i])
|
||||
}
|
||||
top++
|
||||
if top > down { break }
|
||||
|
||||
for i := top; i <= down; i++ {
|
||||
res = append(res, matrix[i][right])
|
||||
}
|
||||
right--
|
||||
if left > right { break }
|
||||
|
||||
for i := right; i >= left; i-- {
|
||||
res = append(res, matrix[down][i])
|
||||
}
|
||||
down--
|
||||
if top > down { break }
|
||||
|
||||
for i := down; i >= top; i-- {
|
||||
res = append(res, matrix[i][left])
|
||||
}
|
||||
left++
|
||||
if left > right { break }
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -217,3 +217,23 @@ public:
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func subarraySum(nums []int, k int) int {
|
||||
m := map[int]int{}
|
||||
m[0] = 1
|
||||
sum := 0
|
||||
cnt := 0
|
||||
for _, num := range nums {
|
||||
sum += num
|
||||
if v, ok := m[sum - k]; ok {
|
||||
cnt += v
|
||||
}
|
||||
m[sum]++
|
||||
}
|
||||
return cnt
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -360,3 +360,49 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func generateMatrix(n int) [][]int {
|
||||
res := make([][]int, n)
|
||||
for i := 0; i < n; i++ {
|
||||
res[i] = make([]int, n)
|
||||
}
|
||||
left, right := 0, n - 1
|
||||
top, buttom := 0, n - 1
|
||||
size, num := n * n, 1
|
||||
for {
|
||||
for i := left; i <= right; i++ {
|
||||
res[top][i] = num
|
||||
num++
|
||||
}
|
||||
top++
|
||||
if num > size { break }
|
||||
|
||||
for i := top; i <= buttom; i++ {
|
||||
res[i][right] = num
|
||||
num++
|
||||
}
|
||||
right--
|
||||
if num > size { break }
|
||||
|
||||
for i := right; i >= left; i-- {
|
||||
res[buttom][i] = num
|
||||
num++
|
||||
}
|
||||
buttom--
|
||||
if num > size { break }
|
||||
|
||||
for i := buttom; i >= top; i-- {
|
||||
res[i][left] = num
|
||||
num++
|
||||
}
|
||||
left++
|
||||
if num > size { break }
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
>
|
||||
> 感谢支持,该仓库会一直维护,希望对各位有一丢丢帮助。
|
||||
>
|
||||
> 另外希望手机阅读的同学可以来我的 <u>[**公众号:袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
|
||||
> 另外希望手机阅读的同学可以来我的 <u>[**公众号:袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
|
||||
|
||||
#### [66. 加一](https://leetcode-cn.com/problems/plus-one/)
|
||||
|
||||
@@ -56,10 +56,10 @@ class Solution {
|
||||
if (digits[i] != 0) {
|
||||
return digits;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
//第三种情况,因为数组初始化每一位都为0,我们只需将首位设为1即可
|
||||
int[] arr = new int[len+1];
|
||||
int[] arr = new int[len+1];
|
||||
arr[0] = 1;
|
||||
return arr;
|
||||
}
|
||||
@@ -122,3 +122,20 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func plusOne(digits []int) []int {
|
||||
l := len(digits)
|
||||
for i := l - 1; i >= 0; i-- {
|
||||
digits[i] = (digits[i] + 1) % 10
|
||||
if digits[i] != 0 {
|
||||
return digits
|
||||
}
|
||||
}
|
||||
digits = append([]int{1}, digits...)
|
||||
return digits
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class Solution {
|
||||
//这里和三向切分不完全一致
|
||||
int i = left;
|
||||
int right = len-1;
|
||||
|
||||
|
||||
while (i <= right) {
|
||||
if (nums[i] == 2) {
|
||||
swap(nums,i,right--);
|
||||
@@ -57,7 +57,7 @@ class Solution {
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void swap (int[] nums, int i, int j) {
|
||||
int temp = nums[i];
|
||||
@@ -72,7 +72,7 @@ Python3 Code:
|
||||
```python
|
||||
from typing import List
|
||||
class Solution:
|
||||
def sortColors(self, nums: List[int]):
|
||||
def sortColors(self, nums: List[int]):
|
||||
leng = len(nums)
|
||||
left = 0
|
||||
# 这里和三向切分不完全一致
|
||||
@@ -89,7 +89,7 @@ class Solution:
|
||||
else:
|
||||
i += 1
|
||||
return nums
|
||||
|
||||
|
||||
def swap(self, nums: List[int], i: int, j: int):
|
||||
temp = nums[i]
|
||||
nums[i] = nums[j]
|
||||
@@ -112,7 +112,7 @@ public:
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
@@ -149,6 +149,32 @@ class Solution {
|
||||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func sortColors(nums []int) {
|
||||
length := len(nums)
|
||||
left, right := 0, length - 1
|
||||
i := left
|
||||
for i <= right {
|
||||
if nums[i] == 2 {
|
||||
// 把2换到最后
|
||||
nums[i], nums[right] = nums[right], nums[i]
|
||||
right--
|
||||
} else if nums[i] == 0 {
|
||||
// 把0换到最前面
|
||||
nums[i], nums[left] = nums[left], nums[i]
|
||||
i++
|
||||
left++
|
||||
} else {
|
||||
i++
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
另外我们看这段代码,有什么问题呢?那就是我们即使完全符合时,仍会交换元素,这样会大大降低我们的效率。
|
||||
|
||||
例如:[0,0,0,1,1,1,2,2,2]
|
||||
@@ -177,7 +203,7 @@ class Solution {
|
||||
int len = nums.length;
|
||||
int right = len - 1;
|
||||
for (int i = 0; i <= right; ++i) {
|
||||
if (nums[i] == 0) {
|
||||
if (nums[i] == 0) {
|
||||
swap(nums,i,left);
|
||||
left++;
|
||||
}
|
||||
@@ -190,7 +216,7 @@ class Solution {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
public void swap (int[] nums,int i, int j) {
|
||||
int temp = nums[i];
|
||||
@@ -220,7 +246,7 @@ class Solution:
|
||||
# 如果不等于 1 则需要继续判断,所以不移动 i 指针,i--
|
||||
if nums[i] != 1:
|
||||
i -= 1
|
||||
i += 1
|
||||
i += 1
|
||||
return nums
|
||||
|
||||
def swap(self, nums: List[int], i: int, j: int):
|
||||
@@ -238,7 +264,7 @@ public:
|
||||
int left = 0, len = nums.size();
|
||||
int right = len - 1;
|
||||
for (int i = 0; i <= right; ++i) {
|
||||
if (nums[i] == 0) {
|
||||
if (nums[i] == 0) {
|
||||
swap(nums[i],nums[left++]);
|
||||
}
|
||||
if (nums[i] == 2) {
|
||||
@@ -265,7 +291,7 @@ class Solution {
|
||||
//nums.swapAt(i, left) 直接调用系统方法
|
||||
self.swap(&nums, i, left) // 保持风格统一走自定义交换
|
||||
left += 1
|
||||
}
|
||||
}
|
||||
if nums[i] == 2 {
|
||||
//nums.swapAt(i, right) 直接调用系统方法
|
||||
self.swap(&nums, i, right) // 保持风格统一走自定义交换
|
||||
@@ -286,3 +312,28 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func sortColors(nums []int) {
|
||||
length := len(nums)
|
||||
left, right := 0, length - 1
|
||||
for i := 0; i <= right; i++ {
|
||||
if nums[i] == 0 {
|
||||
// 为0时,和头交换
|
||||
nums[i], nums[left] = nums[left], nums[i]
|
||||
left++
|
||||
} else if nums[i] == 2 {
|
||||
// 为2时,和尾交换
|
||||
nums[i], nums[right] = nums[right], nums[i]
|
||||
right--
|
||||
// 不为1时,需要把i减回去
|
||||
if nums[i] != 1 {
|
||||
i--
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
>
|
||||
> 感谢支持,该仓库会一直维护,希望对各位有一丢丢帮助。
|
||||
>
|
||||
> 另外希望手机阅读的同学可以来我的 <u>[**公众号:袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
|
||||
> 另外希望手机阅读的同学可以来我的 <u>[**公众号:袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
|
||||
|
||||
#### [剑指 Offer 03. 数组中重复的数字](https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
输入:
|
||||
[2, 3, 1, 0, 2, 5, 3]
|
||||
输出:2 或 3
|
||||
输出:2 或 3
|
||||
|
||||
#### **HashSet**
|
||||
|
||||
@@ -174,3 +174,24 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func findRepeatNumber(nums []int) int {
|
||||
l := len(nums)
|
||||
if l == 0 {
|
||||
return -1
|
||||
}
|
||||
for i := 0; i < l; i++ {
|
||||
// 将nums[i]换到i的位置。
|
||||
for nums[i] != i {
|
||||
if nums[i] == nums[nums[i]] {
|
||||
return nums[i]
|
||||
}
|
||||
nums[i], nums[nums[i]] = nums[nums[i]], nums[i]
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
```
|
||||
|
||||
@@ -119,3 +119,35 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Go Code:
|
||||
|
||||
```go
|
||||
func minSubArrayLen(target int, nums []int) int {
|
||||
length := len(nums)
|
||||
winLen := length + 1
|
||||
i := 0
|
||||
sum := 0
|
||||
for j := 0; j < length; j++ {
|
||||
sum += nums[j]
|
||||
for sum >= target {
|
||||
winLen = min(winLen, j - i + 1)
|
||||
sum -= nums[i]
|
||||
i++
|
||||
}
|
||||
}
|
||||
if winLen == length + 1 {
|
||||
return 0
|
||||
}
|
||||
return winLen
|
||||
}
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user