题目

189. 轮转数组

解题思路

很明显是三次翻转,注意这里的k需要先处理成小于数组大小的数

复杂度

时间复杂度:O(n),相当于翻转数组两次

Code

func rotate(nums []int, k int) {
	if k == 0 {
		return
	}
	k = k % len(nums)
	reverse(nums)
	reverse(nums[:k])
	reverse(nums[k:])
}

func reverse(nums []int) {
	var i, j = 0, len(nums) - 1
	for i < j {
		nums[i], nums[j] = nums[j], nums[i]
		i++
		j--
	}
}

题目

169. 多数元素

解题思路

  1. 直接暴力map
  2. 排序,取中间节点的元素返回
  3. 投票法,相同数字票数+1,否则减1,因为是多数元素,始终都能投出多数票

复杂度

  1. 方法一
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(n)
  2. 方法二
    1. 时间复杂度:O(nlogn) ,为快排复杂度
    2. 空间复杂度:O(logn)
  3. 方法三:
    1. 时间复杂度:O(n)
    2. 空间复杂度:`O(1) ## Code

方法一:

func majorityElement(nums []int) int {
    m := make(map[int]int)
	for _, v := range nums {
		m[v]++
		if m[v] > len(nums)/2 {
			return v
		}
	}
	return -1
}

方法二:

func majorityElement(nums []int) int {
	sort.Ints(nums)
	return nums[len(nums)/2]
}

方法三:

func majorityElement(nums []int) int {
	var (
		vote  int
		count int
	)
	for _, num := range nums {
		if count == 0 {
			vote = num
		}
		if vote == num {
			count++
		} else {
			count--
		}
	}
	return vote
}

gRPC在项目中的运用,本篇文章适用于想要在项目中运用gRPC作为通信框架的技术人员

阅读全文 »

Paxos是出了名的难懂,而Raft正是为了探索一种更易于理解的一致性算法而产生的。它的首要设计目的就是易于理解,所以在选主的冲突处理等方式上它都选择了非常简单明了的解决方案。

阅读全文 »