力扣-leetcode

哈希表

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
}

3.无重复字符的最长子串

给定一个字符串 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
}

5. 最长回文子串

给你一个字符串 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
}

N 字形变换-二维矩阵模拟

二维矩阵模拟-压缩矩阵空间

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
}

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)