
目录
161. 单个编辑距离 One Edit Distance 🌟🌟
162. 寻找峰值 Find Peak Element 🌟🌟
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
161. 单个编辑距离 One Edit Distance
给定两个字符串 s 和 t,判断他们的编辑距离是否为 1。
注意:
满足编辑距离等于 1 有三种可能的情形:
往 s 中插入一个字符得到 t 从 s 中删除一个字符得到 t 在 s 中替换一个字符得到 t
示例 1:
输入: s = "ab", t = "acb" 输出: true 解释: 可以将 'c' 插入字符串 s 来得到 t。
示例 2:
输入: s = "cab", t = "ad" 输出: false 解释: 无法通过 1 步操作使 s 变为 t。
示例 3:
输入: s = "1203", t = "1213" 输出: true 解释: 可以将字符串 s 中的 '0' 替换为 '1' 来得到 t。
代码1: 暴力枚举
package main
import "fmt"
func isOneEditDistance(s string, t string) bool {
	m, n := len(s), len(t)
	if m > n {
		return isOneEditDistance(t, s)
	}
	if n-m > 1 {
		return false
	}
	for i := 0; i < m; i++ {
		if s[i] != t[i] {
			if m == n {
				return s[i+1:] == t[i+1:]
			} else {
				return s[i:] == t[i+1:]
			}
		}
	}
	return m+1 == n
}
func main() {
	s := "ab"
	t := "acb"
	fmt.Println(isOneEditDistance(s, t))
	s = "cab"
	t = "ad"
	fmt.Println(isOneEditDistance(s, t))
	s = "1203"
	t = "1213"
	fmt.Println(isOneEditDistance(s, t))
}
 
暴力枚举2:
```go
 func findPeakElement(nums []int) int {
     n := len(nums)
     for i := 0; i < n; i++ {
         if (i == 0 || nums[i] > nums[i-1]) && (i == n-1 || nums[i] > nums[i+1]) {
             return i
         }
     }
     return -1
 }
 ``` 
代码2: 递归
package main
import "fmt"
func isOneEditDistance(s string, t string) bool {
	if len(s) > len(t) {
		return isOneEditDistance(t, s)
	}
	if len(t)-len(s) > 1 {
		return false
	}
	if len(s) == 0 && len(t) == 0 {
		return false
	} else if len(s) == 0 || len(t) == 0 {
		return true
	} else if s[0] == t[0] {
		return isOneEditDistance(s[1:], t[1:])
	} else if len(s) == len(t) {
		return s[1:] == t[1:] || s[1:] == t[:] || s[:] == t[1:]
	} else {
		return s[:] == t[1:]
	}
}
func main() {
	s := "ab"
	t := "acb"
	fmt.Println(isOneEditDistance(s, t))
	s = "cab"
	t = "ad"
	fmt.Println(isOneEditDistance(s, t))
	s = "1203"
	t = "1213"
	fmt.Println(isOneEditDistance(s, t))
}
 
代码3: 迭代
package main
import "fmt"
func isOneEditDistance(s string, t string) bool {
	m, n := len(s), len(t)
	if m > n {
		return isOneEditDistance(t, s)
	}
	if n-m > 1 {
		return false
	}
	i, j := 0, 0
	edited := false
	for i < m && j < n {
		if s[i] == t[j] {
			i++
			j++
		} else {
			if edited {
				return false
			}
			edited = true
			if m == n {
				i++
				j++
			} else {
				j++
			}
		}
	}
	return edited || i < m
}
func main() {
	s := "ab"
	t := "acb"
	fmt.Println(isOneEditDistance(s, t))
	s = "cab"
	t = "ad"
	fmt.Println(isOneEditDistance(s, t))
	s = "1203"
	t = "1213"
	fmt.Println(isOneEditDistance(s, t))
}
 
输出:
true
 false
 true
162. 寻找峰值 Find Peak Element
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
示例 1:
输入:nums = [1,2,3,1] 输出:2 解释:3 是峰值元素,你的函数应该返回其索引 2。
示例 2:
输入:nums = [1,2,1,3,5,6,4] 输出:1 或 5 解释:你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6。
提示:
1 <= nums.length <= 1000-2^31 <= nums[i] <= 2^31 - 1- 对于所有有效的 
i都有nums[i] != nums[i + 1] 
代码1: 暴力枚举
package main
import "fmt"
func findPeakElement(nums []int) int {
	n := len(nums)
	if n == 1 {
		return 0
	}
	for i := 0; i < n; i++ {
		if i == 0 {
			if nums[i] > nums[i+1] {
				return i
			}
		} else if i == n-1 {
			if nums[i] > nums[i-1] {
				return i
			}
		} else {
			if nums[i] > nums[i-1] && nums[i] > nums[i+1] {
				return i
			}
		}
	}
	return -1
}
func main() {
	nums := []int{1, 2, 3, 1}
	fmt.Println(findPeakElement(nums))
	nums = []int{1, 2, 1, 3, 5, 6, 4}
	fmt.Println(findPeakElement(nums))
}
 
输出:
2
 1 
代码2: 二分查找
package main
import "fmt"
func findPeakElement(nums []int) int {
	n := len(nums)
	if n == 1 {
		return 0
	}
	left, right := 0, n-1
	for left < right {
		mid := left + (right-left)/2
		if nums[mid] < nums[mid+1] {
			left = mid + 1
		} else {
			right = mid
		}
	}
	return left
}
func main() {
	nums := []int{1, 2, 3, 1}
	fmt.Println(findPeakElement(nums))
	nums = []int{1, 2, 1, 3, 5, 6, 4}
	fmt.Println(findPeakElement(nums))
}
 
递归形式:
```go
func findPeakElement(nums []int) int {
     return search(nums, 0, len(nums)-1)
 }
func search(nums []int, left, right int) int {
     if left == right {
         return left
     }
     mid := left + (right-left)/2
     if nums[mid] > nums[mid+1] {
         return search(nums, left, mid)
     }
     return search(nums, mid+1, right)
 }
```
输出:
2
 5
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
![]()  |  Golang每日一练 专栏 | 
![]()  |  Python每日一练 专栏 | 
![]()  |  C/C++每日一练 专栏 | 
![]()  |  Java每日一练 专栏 | 























![[EIS 2019]EzPOP](https://img-blog.csdnimg.cn/a3a869af51d4464f9ea835df3eaefaea.png)