Giter Club home page Giter Club logo

leetcode-go's Introduction

Hello there 👋

I make elegantly professional 💻⎈🐳 Distributed Infrastructure / Kubernetes ☁️ Cloud Native 📝 DeFi Smart Contract and 🌐 Website for a living and also Write some blogs. 🌈

  • 🧐 Interested in full stack. Recent focus on Infra.
  • 💼 Used to be a Staff Engineer at Binance.com, but now I'm a CMU Student.
  • 🎓 Master of Science in Software Engineering, B.S. in Computer Science. Major GPA 3.90/4.0, GPA 3.75/4.0, TOP 3%.
  • 🌱 Currently learning Linux, Rust, Solidity, Math & Philosophy.
  • 📚 Reading 《Systems Performance 2nd Ed.》《BPF Performance Tools book》.
  • 💻 With 4 years' computer science and technology education and 5 years' development working experience.
  • ⛵ Encouraging people for open source collaborations.
  • ✍🏻 I write my personal thoughts on Programming & Tech in my Personal Blog(Cumulative 7.67 million PV / 4.31 million UV).
Some other achievements about me~e~e
  • 💝 Be proud of Stanford. 🧸 Proud Stanford Cardinal. Die Luft der Freiheit weht.
  • 💖 Be proud of CMU. 🐾 Proud Carnegie Mellon Tartan. My heart is in the work.
  • 🎉 Professional Membership of ACM / IEEE / IEEE-CS / CCF.
  • 🍎 Apple Developer.👨🏻‍💻 & Apple Teacher.🤪

  • 👑 Some GitHub statistical reports:

halfrost's Github Stats halfrost's Github Trophy


Take a look at my repositories and let's get in touch!

visitor badge


leetcode-go's People

Contributors

3inchtime avatar brenobaptista avatar cnzbq avatar coder-xiaomo avatar cvenwu avatar dezhiy avatar don2025 avatar dotcom900825 avatar halfrost avatar hanlins avatar imageslr avatar janetyu avatar jessonchan avatar karminski avatar kingeasternsun avatar lhfelis avatar mfzzz avatar novahe avatar saenaii avatar simpleapples avatar ssezhangpeng avatar stellarisw avatar tejasdobariya7 avatar tntc4stl3 avatar tphyhfighting avatar xxgail avatar yangwenmai avatar yangzuwei avatar zhufenggood avatar zzzkl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

leetcode-go's Issues

第十八题测试用例答案错误。

question18{
para18{[]int{1, 0, -1, 0, -2, 2, 0, 0, 0, 0}, 1},
ans18{[][]int{[]int{-1, 0, 0, 1}, []int{-2, -1, 1, 2}, []int{-2, 0, 0, 2}, []int{0, 0, 0, 0}}},
},
这个用例target值为1,答案还是target值为0的结果,实际结果如下:
【input】:{[1 0 -1 0 -2 2 0 0 0 0] 1} 【output】:[[-2 0 1 2] [-1 0 0 2] [0 0 0 1]]

第 39 题的一点优化

一开始已经对数组进行了排序,因此在 for 循环里可以加上 if nums[i] > target { break },当前值已经大于 target 的话,后面的也不用再比较啦,可以提前返回。即:

	for i := index; i < len(nums); i++ {
                if nums[i] > target { break }
		c = append(c, nums[i])
		findcombinationSum(nums, target-nums[i], i, c, res)
		c = c[:len(c)-1]
	}

54 题 Spiral Matrix 一个更简单的做法,空间复杂度 O(1)

刷了好多题都是靠你的解答~ 谢谢帮助。不过在做 54 题的时候发现有一种更简单的方法:只需要提前算出一共多少个元素,这样就不用再操心边界条件了,也不需要设置和 matrix 维度相同的 visit 矩阵。

top、left、right、bottom 分别是剩余区域的上、左、右、下的下边(上下是行下标,左右是列下标)。外层循环每次遍历一圈。

func spiralOrder(matrix [][]int) []int {
	m := len(matrix)
	if m == 0 {
		return nil
	}

	n := len(matrix[0])
	if n == 0 {
		return nil
	}

	top, left, bottom, right := 0, 0, m-1, n-1
	count, sum := 0, m*n
	res := []int{}
	for count < sum {
		i, j := top, left
		for j <= right && count < sum {
			res = append(res, matrix[i][j])
			count++
			j++
		}
		i, j = top + 1, right
		for i <= bottom && count < sum {
			res = append(res, matrix[i][j])
			count++
			i++
		}
		i, j = bottom, right - 1
		for j >= left && count < sum {
			res = append(res, matrix[i][j])
			count++
			j--
		}
		i, j = bottom - 1, left
		for i > top && count < sum {
			res = append(res, matrix[i][j])
			count++
			i--
		}
		top, left, bottom, right = top+1, left+1, bottom-1, right-1
	}
	return res
}

0220.Contains-Duplicate-III code is incorrect

Sample code can't AC in leetcode, broken in case "[1,2,1,1] 1 0". The code only compares edge points(i, j), it should compare the newly added arr[j] with all the items within range [i, j-1]. To do this fast enough, something like BST may help to achieve log(n) find and update.

for j < len(elemList) {
	// Need to compare j with the closest value within range [i, j-1]
	if elemList[j].val-elemList[i].val <= t {
		if abs(elemList[j].idx-elemList[i].idx) <= k {
			return true
		}
		j++
	} else {
		i++
		if j <= i {
			j++
		}
	}
}

复用网站工程和hugo theme.

作者你好,最近也在用leetcode刷题,我是java开发,想把自己刷题的一些思路也记录一下,看到你这个网站包括主题都非常棒,想直接复用一下,题解用java实现,记录自己的学习过程,复用网站工程和 hugo theme,不知是否同意,谢谢!

287 题二分查找的解析与代码不一致,解析存在问题

简述

实测发现,按照题解写出来的代码会陷入死循环。对比了实际代码,发现题解和代码在细节上不一致。题解的思路是正确的,但是细节描述有问题。

题解说:

1 和 7 的中位数是 4,遍历整个数组,统计小于 4 的整数的个数,至多为 3 个,如果超过 3 个就说明重复的数存在于区间 [1,4) 中;否则,重复的数存在于区间 [4,7] 中。

加粗的两个位置成立的前提是计算中位数的时候必须向上取整。但是编程语言的除法是向下取整的。所以如果 low 和 high 相邻,那么 mid 将一直等于 low,然后会一直在区间 [mid, high] 死循环。

正解

  1. 假设有 n+1 个数,则可能重复的数位于区间 [1, n] 中。记该区间最小值、最大值和中间值为 low、high、mid
  2. 遍历整个数组,统计小于等于 mid 的整数的个数,至多为 mid 个
  3. 如果超过 mid 个就说明重复的数存在于区间 [low,mid]闭区间)中;否则,重复的数存在于区间 (mid, high]左开右闭)中
  4. 缩小区间,继续重复步骤 2、3,直到区间变成 1 个整数,即 low == high
  5. 整数 low 就是要找的重复的数

代码在本仓库 287 题的源文件里。

func findDuplicate(nums []int) int {
	low, high := 1, len(nums)-1
	for low < high {
		mid, count := (low+high)/2, 0
		for _, num := range nums {
			if num <= mid {
				count++
			}
		}
		if count > mid {
			high = mid
		} else {
			low = mid + 1
		}
	}
	return low
}

错解改正

注意,一种错误的做法是:

  1. 遍历整个数组,统计小于 mid 的整数的个数,至多为 mid-1 个
  2. 如果超过 mid-1 个就说明重复的数存在于区间 [low,mid)左闭右开)中;否则,重复的数存在于区间 [mid, high]闭区间) 中

错误原因在于,编程语言的除法是向下取整的。如果 low 和 high 相邻,那么 mid 将一直等于 low,将一直在区间 [mid, high] 死循环。因此必须保证下一次遍历时,mid 不等于上一轮的 mid。上面的正确做法就有这个保证,这里如果把求 mid 的除法运算改成向上取整,就可以通过了。

		mid, count := (low+high+1)/2, 0 // ①
		for _, num := range nums {
			if num < mid { // ②
				count++
			}
		}
		if count >= mid { // ③
			high = mid - 1
		} else {
			low = mid // ④
		}

是否增加 python solutions?

目前 leetcode 下都是 go 写的 solutions,是否考虑增加 python 版本的 solutions 呢?因为大量的同学不会 golang。

004 这里两个有序数组被分割线分割后又合并后的配图有点费解

分割线是为了确保左边所有元素的最大值,小于右边所有元素的最小值,
两个数组的两个分割线将数组分成4份,
这4份合并起来不能构成一个有序数组,文章中将其合并为一个数组的描述方式容易让人误解,
可以强调下合并后的不是有序数组,或者用下面这样的配图,更容易理解点:

image

前来膜拜一下大佬

最近也正在每做一个题整理自己的思路,方便以后放到自己的博客上,特地来找大佬取经学习

0118 文件名似乎是多了个中文空格,go mod 无法使用

go: finding github.com/halfrost/LeetCode-Go/structures latest
go: finding github.com/halfrost/LeetCode-Go latest
go: extracting github.com/halfrost/LeetCode-Go v0.0.0-20200828032122-2363839e94c6
-> unzip /home/peng/code/pkg/mod/cache/download/github.com/halfrost/!leet!code-!go/@v/v0.0.0-20200828032122-2363839e94c6.zip: malformed file path "leetcode/0118.Pascals-Triangle/118. Pascal's Triangle.go": invalid char '\''

15. 三数之和

这道题用 排序+双指针的解法更快一些

func threeSum(nums []int) [][]int {
	sort.Ints(nums)
	var (
		result = make([][]int, 0)
		start, end, index, addNum int
		length = len(nums)
	)
	if length > 0 && (nums[0] > 0 || nums[length -1 ] < 0) {
		return result
	}
	for index = 1; index < length - 1; index++ {
		start, end = 0, length - 1
		if index > 1 && nums[index] == nums[index - 1]{
			start = index - 1
		}
		for start < index && end > index {
			if start > 0 && nums[start] == nums[start - 1]{
				start++
				continue
			}
			if end < length-1 && nums[end] == nums[end+1]{
				end--
				continue
			}
			addNum = nums[start] + nums[end] + nums[index]
			if addNum == 0 {
				result = append(result, []int{nums[start], nums[index], nums[end]})
				start ++
				end --
			} else if addNum > 0 {
				end--
			} else {
				start++
			}
		}
	}
	return result
}

题解 148:删除重复函数

题解 148 中出现了这样一段重复的函数,删掉mergeTwoLists148就好了。sortList函数调用的函数名称也要对应改一下。

func mergeTwoLists148(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1 == nil {
		return l2
	}
	if l2 == nil {
		return l1
	}
	if l1.Val < l2.Val {
		l1.Next = mergeTwoLists(l1.Next, l2)
		return l1
	}
	l2.Next = mergeTwoLists(l1, l2.Next)
	return l2
}

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1 == nil {
		return l2
	}
	if l2 == nil {
		return l1
	}
	if l1.Val < l2.Val {
		l1.Next = mergeTwoLists(l1.Next, l2)
		return l1
	}
	l2.Next = mergeTwoLists(l1, l2.Next)
	return l2
}

86题答案好像不太对

func Test_partition(t *testing.T) {
input1, input2 := structures.Ints2List([]int{1, 4, 3, 2, 5, 2}), 3
fmt.Println(structures.List2Ints(partition(input1,input2))) // [1 2 2 4 3 5]
}

4不是应该在3后面么

问一个关于746. Min Cost Climbing Stairs的问题

首先感谢halfrost以及大家的贡献。我在看746题的过程中,觉得第一个example的答案应该是10吧?就是我可以先从index=0开始,然后付费后,选择走两步阶梯到达顶端,不知道我的理解哪里有错?谢谢。

1048 的DP 感觉有点问题。

我们是打算 sort 一下 然后按倒序排列
比如
bdca, bda, bca, ba, b, a

并且有一个poss 来纪录 每一种LENGTH 最初始的index,
POSS[1] = 4
POSS[2] = 3
POSS[3] = 1
POSS[4] = 0

然后我们从后面Index 开始

dp := make([]int, len(words))
for i := len(words) - 1; i >= 0; i-- {
	dp[i] = 1
	for j := poss[len(words[i])+1]; j < len(words) && len(words[j]) == len(words[i])+1; j++ {
		if isPredecessor(words[j], words[i]) {
			dp[i] = max(dp[i], 1+dp[j])
		}
	}
	res = max(res, dp[i])
}
return res

word[I] 是小的
找word[J](多出一个字母的) 来判断 I 是否是 J 的pre
我觉的 我们应该是要UPDATE dp[j] = max ( dp[i] + 1, dp[j])
这样 我们可以不断地往前推。 而且最开始要加一个condition
if(dp[i] == 0 )
dp[i] = 1;
防止之前找到过PRE的被重新重置到1.

我不清楚 是不是我没太了解你的思路 但感觉你这个代码应该过不了吧。

能不能实现一个刷题记录器

如题能不能实现一个刷题记录器,如果已经做过就打勾,不用登录使用cookie存到浏览器就行,这样就不用对着目录找哪个刷过哪个没刷过了

第三题是否可以使用位图记录?

这一题与第 76 题,第 438 题不太一样,题目要求找出其中不含有重复字符的最长子串,所以我使用位图来记录字串含有的字符,使用 benchmark 测试约有一倍的性能提升。

func lengthOfLongestSubstring(s string) int {
	if len(s) == 0 {
		return 0
	}
	// 扩展 ASCII 码的位图表示(BitSet),共有 256 位
	var bitSet [256]uint8
	result, left, right := 0, 0, 0
	for left < len(s) {
		if right < len(s) && bitSet[s[right]] == 0 {
			// 标记对应的 ASCII 码为 1
			bitSet[s[right]] = 1
			right++
		} else {
			// 标记对应的 ASCII 码为 0
			bitSet[s[left]] = 0
			left++
		}
		result = max(result, right-left)
	}
	return result
}

由于没有找到较好的 Go BitSet 实现方法,每一个 bit 位实际使用一个 uint8 表示。
实际思路与原题解一致,只不过不用考虑字符出现的频率。

53. dp[i]定义有疑问

dp[i]表示[0, i]区间内各子区间和的最大值

对于输入 nums = [-2,1,-3,4,-1,2,1,-5,4]
dp[0] = -2;
dp[1] = 1;
dp[2] = -3; // 但是[0,2]内子区间和的最大值应该是1,所以反证定义了。

状态转移是对的但是,dp[i]很难表述是什么

English translation

Hi,

I'm glad I have found this repo, but it's really difficult going through the materials using google translator. Do you have any plans releasing the material in english language as well?

在你这里学习了,谢谢。并附上 0351 Android Unlock Pattern 的golang题解

var blocker = [][]int{
	//  1  2  3  4  5  6  7  8  9   // first column is added so we use 1-9
	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 0 phantom node. as the STARTING point
	{0, 0, 0, 2, 0, 0, 0, 4, 0, 5}, // 1
	{0, 0, 0, 0, 0, 0, 0, 0, 5, 0}, // 2
	{0, 2, 0, 0, 0, 0, 0, 5, 0, 6}, // 3
	{0, 0, 0, 0, 0, 0, 5, 0, 0, 0}, // 4
	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 5
	{0, 0, 0, 0, 5, 0, 0, 0, 0, 0}, // 6
	{0, 4, 0, 5, 0, 0, 0, 0, 0, 8}, // 7
	{0, 0, 5, 0, 0, 0, 0, 0, 0, 0}, // 8
	{0, 5, 0, 6, 0, 0, 0, 8, 0, 0}, // 9
}

var M, N int

func numberOfPatterns(m, n int) int {
	M = m
	N = n
	var work = make([]bool, 10, 10)
	return count(work, 0, 0)
}

func count(work []bool, now int, already int) (res int) {
	if already >= M && already <= N {
		res++
	} else if already > N {
		return
	}
	for i, tmp := 1, 0; i != 10; i++ {
		if work[i] { // if already visited
			continue
		}
		tmp = blocker[now][i]
		if tmp == 0 || work[tmp] {
			work[i] = true
			already++
			res += count(work, i, already)
			already--
			work[i] = false
		}
	}
	return
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.