目录
4. 寻找两个正序数组的中位数 Median of two sorted arrays
5. 最长回文子串 Longest Palindromic Substring
4. 寻找两个正序数组的中位数 Median of two sorted arrays
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))
。
示例 1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-10^6 <= nums1[i], nums2[i] <= 10^6
代码:
package main
import (
"fmt"
)
func Max(a int, b int) int {
if a < b {
return b
}
return a
}
func Min(a int, b int) int {
if a > b {
return b
}
return a
}
func findMedian(nums1 []int, nums2 []int) float64 {
len1, len2 := len(nums1), len(nums2)
if len1 > len2 {
return findMedian(nums2, nums1)
}
low, high, k, mid1, mid2 := 0, len1, (len1+len2+1)/2, 0, 0
for low <= high {
mid1 = low + (high-low)/2
mid2 = k - mid1
if mid1 > 0 && nums1[mid1-1] > nums2[mid2] {
high = mid1 - 1
} else if mid1 != len(nums1) && nums1[mid1] < nums2[mid2-1] {
low = mid1 + 1
} else {
break
}
}
left, right := 0, 0
if mid1 == 0 {
left = nums2[mid2-1]
} else if mid2 == 0 {
left = nums1[mid1-1]
} else {
left = Max(nums1[mid1-1], nums2[mid2-1])
}
if (len(nums1)+len(nums2))&1 == 1 {
return float64(left)
}
if mid1 == len(nums1) {
right = nums2[mid2]
} else if mid2 == len(nums2) {
right = nums1[mid1]
} else {
right = Min(nums1[mid1], nums2[mid2])
}
return float64(left+right) / 2
}
func main() {
num1 := []int{1, 3}
num2 := []int{2}
fmt.Println(findMedian(num1, num2))
num1 = []int{1, 2}
num2 = []int{3, 4}
fmt.Println(findMedian(num1, num2))
}
输出:
2
2.5
5. 最长回文子串 Longest Palindromic Substring
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
代码:
package main
import (
"fmt"
)
func longestPalindrome(s string) string {
if len(s) <= 1 {
return s
}
if len(s) == 2 && s[0] == s[1] {
return s
} else if len(s) == 2 {
return string(s[0])
}
max, ans := 0, string(s[0])
var dp [1005][1005]bool
for i := 1; i < len(s); i++ {
for j := 0; j < i; j++ {
if s[i] == s[j] && (i-j <= 2 || (dp[j+1][i-1])) {
dp[j][i] = true
if (i - j) >= max {
max = i - j
ans = s[j : i+1]
}
}
}
}
return ans
}
func main() {
s := "babad"
fmt.Println(longestPalindrome(s))
s = "cbbd"
fmt.Println(longestPalindrome(s))
}
输出:
aba
bb
代码2:
package main
import (
"fmt"
)
func longestPalindrome(s string) string {
if len(s) <= 1 {
return s
}
start, end := 0, 0
for i := 0; i < len(s); i++ {
l1, r1 := expandAroundCenter(s, i, i)
l2, r2 := expandAroundCenter(s, i, i+1)
if r1-l1 > end-start {
start, end = l1, r1
}
if r2-l2 > end-start {
start, end = l2, r2
}
}
return s[start : end+1]
}
func expandAroundCenter(s string, left, right int) (int, int) {
for left >= 0 && right < len(s) && s[left] == s[right] {
left--
right++
}
return left + 1, right - 1
}
func main() {
s := "babad"
fmt.Println(longestPalindrome(s))
s = "cbbd"
fmt.Println(longestPalindrome(s))
}
输出:
bab
bb
6. Z字形变换 Zigzag Conversion
将一个给定字符串 s
根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING"
行数为 3
时,排列如下:
P A H N A P L S I I G Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
提示:
1 <= s.length <= 1000
s
由英文字母(小写和大写)、','
和'.'
组成1 <= numRows <= 1000
代码:
package main
import (
"fmt"
"strings"
)
func convert(s string, numRows int) string {
if numRows == 1 {
return s
}
n := len(s)
cycleLen := 2*numRows - 2
var ans strings.Builder
for i := 0; i < numRows; i++ {
for j := 0; j+i < n; j += cycleLen {
ans.WriteByte(s[j+i])
if i != 0 && i != numRows-1 && j+cycleLen-i < n {
ans.WriteByte(s[j+cycleLen-i])
}
}
}
return ans.String()
}
func main() {
s := "PAYPALISHIRING"
fmt.Println(convert(s, 3))
fmt.Println(convert(s, 4))
fmt.Println(convert("A", 1))
}
输出:
PAHNAPLSIIGYIR
PINALSIGYAHRPI
A
🌟 Golang Leetcode 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!