func twoSum(nums []int, target int) []int {
tt := make(map[int]int)
for _, value := range nums {
if _,ok := tt[value];ok {
return []int{value,tt[value]}
}
tt[target-value] = value
}
return nil
}
type ListNode struct {
Val int
Next *ListNode
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
dummy := &ListNode{Val:-1}
dn := dummy
add := 0
for l1 != nil || l2 != nil {
a,b := 0,0
if l1 != nil {
a = l1.Val
}
if l2 != nil {
a = l2.Val
}
num := a+b+add
add = num/10
dn.Next = &ListNode{Val:num%10}
dn = dn.Next
if l1 != nil {
l1 = l1.Next
}
if l2 != nil {
l2 = l2.Next
}
}
if add != 0 {
dn.Next = &ListNode{Val:add}
}
return dummy.Next
}
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
func lengthOfLongestSubstring(s string) int { //abcabcbb
var n = len(s)
if n <= 1 {
return n
}
left := 0
max := 1
strMap := make(map[byte]bool)
for i:=0; i<n; i++ {
str := s[i]
for strMap[str] {
delete(strMap,str)
left ++
}
if i-left+1 >max {
max = i-left+1
}
strMap[str] = true
}
return max
}
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
二分查找法
func main() {
fmtx.Println("w333")
num1 := []int{1, 4, 6, 8, 9, 12}
num2 := []int{2, 3, 5, 7, 10, 11, 13}
fmtx.Println("中位数:", findMedianSortedArrays(num1, num2))
}
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
niu := len(nums1) + len(nums2)
k := niu / 2
if niu%2 == 1 {
return float64(getE(nums1, nums2, k+1))
} else {
return float64(getE(nums1, nums2, k+1)+getE(nums1, nums2, k)) / 2.0
}
}
func getE(nums1, nums2 []int, k int) int {
//k是取剩余几位数 k:5
index1, index2 := 0, 0 //两个数组当前的位置
for {
if index1 == len(nums1) {
return nums2[index2+k-1]
}
if index2 == len(nums2) {
return nums1[index1+k-1]
}
if k == 1 {
return min(nums1[index1], nums2[index2])
}
pp := k / 2
p1 := min(index1+pp, len(nums1)) - 1
p2 := min(index2+pp, len(nums2)) - 1
n1, n2 := nums1[p1], nums2[p2]
if n1 < n2 {
k -= p1 + 1 - index1
index1 = p1 + 1
} else {
k -= p2 + 1 - index2
index2 = p2 + 1
}
}
return 0
}
func min(x int, y int) int {
if x > y {
return y
}
return x
}
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
中心扩展算法
func long(s string) string {
start, end := 0, 0
for i := 0; i < len(s); i++ {
l1, r1 := cen(s, i, i)
l2, r2 := cen(s, i, i+1)
if r1-l1 > end-start {
start = l1
end = r1
}
if r2-l2 > end-start {
start = l2
end = r2
}
}
return s[start:end+1]
}
func cen(s string, l1, r1 int) (int, int) {
for l1 >= 0 && r1 < len(s) && s[l1] == s[r1] {
l1--
r1++
}
return l1 + 1, r1 - 1
}
二维矩阵模拟-压缩矩阵空间
func convert(s string, numRows int) string {
t, x := numRows*2-2, 0
str := make([][]rune, numRows)
for i, val := range s {
str[x] = append(str[x], val)
if i%t < numRows-1 {
x++
} else {
x--
}
}
ss := ""
for _, runes := range str {
ss += string(runes)
}
return ss
}