Merge pull request #139 from NovaHe/fix/91

Fix/91 and 80
This commit is contained in:
halfrost
2021-05-26 00:47:31 +08:00
committed by GitHub
6 changed files with 36 additions and 106 deletions

View File

@ -1,35 +1,12 @@
package leetcode
func removeDuplicates80(nums []int) int {
if len(nums) == 0 {
return 0
}
last, finder := 0, 0
for last < len(nums)-1 {
startFinder := -1
for nums[finder] == nums[last] {
if startFinder == -1 || startFinder > finder {
startFinder = finder
}
if finder == len(nums)-1 {
break
}
finder++
}
if finder-startFinder >= 2 && nums[finder-1] == nums[last] && nums[finder] != nums[last] {
nums[last+1] = nums[finder-1]
nums[last+2] = nums[finder]
last += 2
} else {
nums[last+1] = nums[finder]
last++
}
if finder == len(nums)-1 {
if nums[finder] != nums[last-1] {
nums[last] = nums[finder]
}
return last + 1
func removeDuplicates(nums []int) int {
slow := 0
for fast, v := range nums {
if fast < 2 || nums[slow-2] != v {
nums[slow] = v
slow++
}
}
return last + 1
return slow
}

View File

@ -61,7 +61,7 @@ func Test_Problem80(t *testing.T) {
for _, q := range qs {
_, p := q.ans80, q.para80
fmt.Printf("【input】:%v 【output】:%v\n", p.one, removeDuplicates80(p.one))
fmt.Printf("【input】:%v 【output】:%v\n", p.one, removeDuplicates(p.one))
}
fmt.Printf("\n\n\n")
}

View File

@ -51,6 +51,6 @@ for (int i = 0; i < len; i++) {
## 解题思路
这道题和第 26 题很像。是第 26 题的加强版。这道题和第 283 题,第 27 题基本一致283 题是删除 027 题是删除指定元素,这一题是删除重复元素,实质是一样的
这里数组的删除并不是真的删除只是将删除的元素移动到数组后面的空间内然后返回数组实际剩余的元素个数OJ 最终判断题目的时候会读取数组剩余个数的元素进行输出。
问题提示有序数组,一般最容易想到使用双指针的解法,双指针的关键点:移动两个指针的条件
在该题中移动的条件:快指针从头遍历数组,慢指针指向修改后的数组的末端,当慢指针指向倒数第二个数与快指针指向的数不相等时,才移动慢指针,同时赋值慢指针
处理边界条件:当数组小于两个元素时,不做处理

View File

@ -1,29 +1,16 @@
package leetcode
import (
"strconv"
)
func numDecodings(s string) int {
if len(s) == 0 {
return 0
}
dp := make([]int, len(s)+1)
n := len(s)
dp := make([]int, n+1)
dp[0] = 1
if s[:1] == "0" {
dp[1] = 0
} else {
dp[1] = 1
}
for i := 2; i <= len(s); i++ {
lastNum, _ := strconv.Atoi(s[i-1 : i])
if lastNum >= 1 && lastNum <= 9 {
for i := 1; i <= n; i++ {
if s[i-1] != '0' {
dp[i] += dp[i-1]
}
lastNum, _ = strconv.Atoi(s[i-2 : i])
if lastNum >= 10 && lastNum <= 26 {
if i > 1 && s[i-2] != '0' && (s[i-2]-'0')*10+(s[i-1]-'0') <= 26 {
dp[i] += dp[i-2]
}
}
return dp[len(s)]
return dp[n]
}