链表、数组

34 阅读2分钟

283 移动0

func moveZeroes(nums []int)  {
    left := 0
    for i, num := range nums {
        if num != 0 {
            nums[left] = num
            if left != i {
                nums[i] = 0
            }
            left++
        }
    }
}

11 盛最多的水

func maxArea(height []int) int {
    left, right := 0, len(height) - 1
    maxArea := 0
    for left < right {
        area := min(height[left], height[right]) * (right - left)
        maxArea = max(maxArea, area)
        if height[left] < height[right] {
            left++
        } else {
            right--
        }
    }
    return maxArea
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func min (a, b int) int {
    if a > b {
        return b
    }
    return a
}

70 爬楼梯

func climbStairs(n int) int {
	if n < 4 {
		return n
	}
	a, b, c := 1, 2, 3
	for i := 3; i < n; i++ {
		a, b, c = b, a+b, b+c
	}
	return c
}

15 三数之和

func threeSum(nums []int) [][]int {
	sort.Ints(nums)
	var res [][]int
	for i := 0; i < len(nums)-2; i++ {
		if nums[i] > 0 {
			break
		}
		if i > 0 && nums[i] == nums[i-1] {
			continue
		}
		left, right := i+1, len(nums)-1
		for left < right {
			sum := nums[i] + nums[left] + nums[right]
			if sum == 0 {
				res = append(res, []int{nums[i], nums[left], nums[right]})
				for left < right && nums[left] == nums[left+1] {
					left++
				}
				for left < right && nums[right] == nums[right-1] {
					right--
				}
				left++
				right--
			} else if sum > 0 {
				left++
			} else {
				right--
			}
		}
	}
	return res
}

链表

206 反转链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    var prev *ListNode
    for head != nil {
        next := head.Next
        head.Next = prev
        prev = head
        head = next
    }
    return prev
}

25 K个一组翻转链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseKGroup(head *ListNode, k int) *ListNode {
	cur := head
	// 校验是否够K个数、不够则返回
	for i := 0; i < k; i++ {
		if cur == nil {
			return head
		}
		cur = cur.Next
	}

	var prev, next *ListNode
	cur = head
	for i := 0; i < k; i++ {
		next = cur.Next
		cur.Next = prev
		prev = cur
		cur = next
	}

	head.Next = reverseKGroup(cur, k)
	return prev
}

24 两两交换链表中的节点

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    next := head.Next
    head.Next = swapPairs(head.Next.Next)
    next.Next = head
    return next
}

// 迭代 哨兵节点的优势是边界点明确、减少逻辑判断
// 循环时有三个点需要交换
func swapPairs(head *ListNode) *ListNode {
    dummy := &ListNode{0, head}
    curr := dummy
    for curr.Next != nil && curr.Next.Next != nil {
        prev := curr.Next
        next := curr.Next.Next
        curr.Next = next
        prev.Next = next.Next
        next.Next = prev
        curr = prev
    }
    return dummy.Next
}

141 环形链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func hasCycle(head *ListNode) bool {
	if head == nil || head.Next == nil {
		return false
	}
	left, right := head, head.Next
	for right != nil {
		if right.Next == nil {
			return false
		}
		if left == right {
			return true
		}
		left = left.Next
		right = right.Next.Next
	}
	return false
}