go leetcode 4~6 寻找两个正序数组的中位数 最长回文子串 Z字形变换

目录

4. 寻找两个正序数组的中位数 Median of two sorted arrays

5. 最长回文子串 Longest Palindromic Substring

6. Z字形变换 Zigzag Conversion

🌟 Golang Leetcode 🌟 ​


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 🌟 ​

 持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

 评论,你的意见是我进步的财富!  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值