当前位置:网站首页>Leetcode array operation
Leetcode array operation
2022-07-05 06:13:00 【Dawnlighttt】
List of articles
q54 Spiral matrix
Answer key
Traverse every row and column in a layer by layer way , The last element of each row or column is the beginning of the next column or row . Because the side length of the matrix in the question is not necessarily equal , So in the end, there will be an extra row or column , It can be treated separately .
func spiralOrder(matrix [][]int) []int {
if len(matrix) == 0 {
return []int{
}
}
res := make([]int, 0)
top, bottom, left, right := 0, len(matrix) - 1, 0, len(matrix[0]) - 1
// Traverse in a ring , The last element of each row or column is the beginning of the next column or row
for top < bottom && left < right {
for i := left; i < right; i++ {
res = append(res, matrix[top][i])
}
for i := top; i < bottom; i++ {
res = append(res, matrix[i][right])
}
for i := right; i > left; i-- {
res = append(res, matrix[bottom][i])
}
for i := bottom; i > top; i-- {
res = append(res, matrix[i][left])
}
right--
top++
bottom--
left++
}
// One more line
if top == bottom {
for i := left; i <= right; i++ {
res = append(res, matrix[top][i])
}
// One more column
} else if left == right {
for i := top; i <= bottom; i++ {
res = append(res, matrix[i][left])
}
}
return res
}
q73 Matrix zeroing
Answer key
Use a hash table to mark the value as 0 Coordinates of , Then traverse the hash table , Set the elements of the same row and column to 0 .
type Point struct {
x int
y int
}
func setZeroes(matrix [][]int) {
m, n := len(matrix), len(matrix[0])
hashTable := make(map[Point]bool)
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if matrix[i][j] == 0 && hashTable[Point{
i, j}] == false {
hashTable[Point{
i, j}] = true
}
}
}
for key, _ := range hashTable {
// The same column becomes 0
for i := 0; i < m; i++ {
matrix[i][key.y] = 0
}
// Peers become 0
for i := 0; i < n; i++ {
matrix[key.x][i] = 0
}
}
}
q78 A subset of
Answer key
This question can use dfs and bfs There are two ways to solve .
dfs:
func subsets(nums []int) [][]int {
res = make([][]int, 0)
dfs(nums, 0, nil)
return res
}
func dfs(nums []int, path int, prefix []int) {
if path >= len(nums) {
dst := make([]int, len(prefix))
copy(dst, prefix)
res = append(res, dst)
return
}
dfs(nums, path + 1, append(prefix, nums[path]))
dfs(nums, path + 1, prefix)
}
bfs:
func subsets1(nums []int) [][]int {
res := make([][]int, 0)
path := make([]int, 0)
var bfs func(int)
bfs = func(start int) {
if start > len(nums) {
return
}
tmp := make([]int, len(path))
copy(tmp, path)
res = append(res, tmp)
for i := start; i < len(nums); i++ {
path = append(path, nums[i])
bfs(i + 1)
path = path[:len(path) - 1]
}
}
bfs(0)
return res
}
q384 Scramble the array
Answer key
The hardest part of this problem is how to disturb the array , The strategy is like this : loop n Time , Exchange the randomly obtained array elements with the last element of the array every time .
type Solution struct {
nums []int
reNums []int
}
func Constructor(nums []int) Solution {
return Solution{
nums: nums, reNums: append([]int{
}, nums...)}
}
func (this *Solution) Reset() []int {
return this.reNums
}
func (this *Solution) Shuffle() []int {
for n := len(this.nums); n > 0; n-- {
randIndex := rand2.Intn(n)
this.nums[n - 1], this.nums[randIndex] = this.nums[randIndex], this.nums[n - 1]
}
return this.nums
}
q581 The shortest continuous unordered subarray
Answer key
First, determine the boundary of the subarray , We set it as begin and end. Actually begin Is the subscript of the last number greater than the minimum , and end In fact, it is the subscript of the last element smaller than the maximum . For example, it is easy to understand :{1, 2, 5, 4, 3, 6, 7} , In this case , The last number smaller than the maximum is actually 3, Because the array traverses to 3 When , The maximum value at this time is 5, therefore 3 Is the last number smaller than the maximum , In the following traversal , Are updated maximum . So it is the same to find the left boundary .
func findUnsortedSubarray(nums []int) int {
n := len(nums)
min, max := nums[n - 1], nums[0]
begin, end := -1, -1
for i := 0; i < n; i++ {
if nums[i] >= max {
max = nums[i]
} else {
end = i
}
if nums[n - i - 1] <= min {
min = nums[n - i - 1]
} else {
begin = n - i - 1
}
}
// Special judgement
if end == -1 {
return 0
}
return end - begin + 1
}
q945 Use the minimum increment unique to the array
Answer key
First, sort the array , Then iterate through the array , If the current element is less than or equal to its previous element , Then change it to the previous number +1 .
func minIncrementForUnique(nums []int) int {
sort.Ints(nums)
move := 0
for i := 1; i < len(nums); i++ {
if nums[i] <= nums[i - 1] {
prev := nums[i]
nums[i] = nums[i - 1] + 1
move += nums[i] - prev
}
}
return move
}
边栏推荐
猜你喜欢
Open source storage is so popular, why do we insist on self-development?
[jailhouse article] look mum, no VM exits
Appium自动化测试基础 — Appium测试环境搭建总结
可变电阻器概述——结构、工作和不同应用
Full Permutation Code (recursive writing)
Matrixdb V4.5.0 was launched with a new mars2 storage engine!
leetcode-6108:解密消息
快速使用Amazon MemoryDB并构建你专属的Redis内存数据库
Real time clock (RTC)
4. 对象映射 - Mapping.Mapster
随机推荐
The connection and solution between the shortest Hamilton path and the traveling salesman problem
Arduino 控制的 RGB LED 无限镜
【Rust 笔记】16-输入与输出(下)
对for(var i = 0;i < 5;i++) {setTimeout(() => console.log(i),1000)}的深入分析
Control unit
Implement a fixed capacity stack
Sword finger offer II 058: schedule
1.13 - RISC/CISC
Overview of variable resistors - structure, operation and different applications
Implement an iterative stack
Data visualization chart summary (I)
可变电阻器概述——结构、工作和不同应用
R language [import and export of dataset]
Redis publish subscribe command line implementation
1.15 - 输入输出系统
Wazuh开源主机安全解决方案的简介与使用体验
QQ computer version cancels escape character input expression
On the characteristics of technology entrepreneurs from Dijkstra's Turing Award speech
LeetCode 1200. Minimum absolute difference
LeetCode 0107.二叉树的层序遍历II - 另一种方法