Цена за 48 часов в ленте | 750,00 |
Цена за 1 час закрепления | — |
Взаимопиар | Нет |
Input: image = [[1,1,1],[1,1,0],[1,0,1]], sr = 1, sc = 1, color = 2
Output: [[2,2,2],[2,2,0],[2,0,1]]
package main
func floodFill(image [][]int, sr int, sc int, color int) [][]int {
originalColor := image[sr][sc]
if originalColor == color {
return image
}
var dfs func(x, y int)
dfs = func(x, y int) {
if x < 0 || x >= len(image) || y < 0 || y >= len(image[0]) || image[x][y] != originalColor {
return
}
image[x][y] = color
dfs(x+1, y)
dfs(x-1, y)
dfs(x, y+1)
dfs(x, y-1)
}
dfs(sr, sc)
return image
}
Input: a = "11", b = "1"
Output: "100"
func addBinary(a string, b string) string {
n, m := len(a), len(b)
if n < m {
return addBinary(b, a)
}
var result strings.Builder
carry, j := 0, m-1
for i := n - 1; i >= 0; i-- {
if a[i] == '1' {
carry++
}
if j >= 0 && b[j] == '1' {
carry++
}
j--
result.WriteByte('0' + byte(carry%2))
carry /= 2
}
if carry == 1 {
result.WriteByte('1')
}
s := result.String()
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
Input: jobDifficulty = [6,5,4,3,2,1], d = 2
Output: 7
Explanation: First day you can finish the first 5 jobs, total difficulty = 6.
Second day you can finish the last job, total difficulty = 1.
The difficulty of the schedule = 6 + 1 = 7
func minDifficulty(jobDifficulty []int, d int) int {
n := len(jobDifficulty)
if n < d {
return -1
}
mem := make([][]int, n)
for i := range mem {
mem[i] = make([]int, d+1)
for j := range mem[i] {
mem[i][j] = -1
}
}
return minDiff(0, d, jobDifficulty, mem)
}
func minDiff(i, daysRemaining int, jobDifficulty []int, mem [][]int) int {
if mem[i][daysRemaining] != -1 {
return mem[i][daysRemaining]
}
if daysRemaining == 1 {
res := 0
for j := i; j < len(jobDifficulty); j++ {
if jobDifficulty[j] > res {
res = jobDifficulty[j]
}
}
return res
}
res := int(^uint(0) >> 1)
dailyMaxJobDiff := 0
for j := i; j < len(jobDifficulty)-daysRemaining+1; j++ {
if jobDifficulty[j] > dailyMaxJobDiff {
dailyMaxJobDiff = jobDifficulty[j]
}
next := minDiff(j+1, daysRemaining-1, jobDifficulty, mem)
if res > dailyMaxJobDiff+next {
res = dailyMaxJobDiff + next
}
}
mem[i][daysRemaining] = res
return res
}
Input: nums = [1,2,1,2,3], k = 2
Output: 7
Explanation: Subarrays formed with exactly 2 different integers: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2]
func countGoodSubarrays(nums []int, k int) int {
count := 0
left := 0
right := 0
distinctCount := 0
freq := make(map[int]int)
for right < len(nums) {
freq[nums[right]]++
if freq[nums[right]] == 1 {
distinctCount++
}
right++
for distinctCount > k {
freq[nums[left]]--
if freq[nums[left]] == 0 {
distinctCount--
}
left++
}
if distinctCount == k {
count++
}
}
return count
}
Input: grid = [" /","/ "]
Output: 2
type DSU struct {
parent []int
}
func NewDSU(N int) *DSU {
dsu := &DSU{parent: make([]int, N)}
for i := range dsu.parent {
dsu.parent[i] = i
}
return dsu
}
func (dsu *DSU) find(x int) int {
if dsu.parent[x] != x {
dsu.parent[x] = dsu.find(dsu.parent[x])
}
return dsu.parent[x]
}
func (dsu *DSU) union(x, y int) {
dsu.parent[dsu.find(x)] = dsu.find(y)
}
func regionsBySlashes(grid []string) int {
N := len(grid)
dsu := NewDSU(4 * N * N)
for r := 0; r < N; r++ {
for c := 0; c < N; c++ {
root := 4 * (r * N + c)
val := grid[r][c]
if val != '\\' {
dsu.union(root + 0, root + 1)
dsu.union(root + 2, root + 3)
}
if val != '/' {
dsu.union(root + 0, root + 2)
dsu.union(root + 1, root + 3)
}
if r + 1 < N {
dsu.union(root + 3, (root + 4 * N) + 0)
}
if r - 1 >= 0 {
dsu.union(root + 0, (root - 4 * N) + 3)
}
if c + 1 < N {
dsu.union(root + 2, (root + 4) + 1)
}
if c - 1 >= 0 {
dsu.union(root + 1, (root - 4) + 2)
}
}
}
ans := 0
for x := 0; x < 4 * N * N; x++ {
if dsu.find(x) == x {
ans++
}
}
return ans
}
Input: arr = [9,4,2,10,7,8,8,1,9]
Output: 5
Explanation: arr[1] > arr[2] < arr[3] > arr[4] < arr[5]
func maxTurbulenceSize(A []int) int {
N := len(A)
ans := 1
anchor := 0
for i := 1; i < N; i++ {
c := compare(A[i-1], A[i])
if c == 0 {
anchor = i
} else if i == N-1 || c*compare(A[i], A[i+1]) != -1 {
if i-anchor+1 > ans {
ans = i - anchor + 1
}
anchor = i
}
}
return ans
}
func compare(a, b int) int {
if a > b {
return 1
}
if a < b {
return -1
}
return 0
}
Input: firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
Output: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
func intervalIntersection(firstList [][]int, secondList [][]int) [][]int {
i, j := 0, 0
var result [][]int
for i < len(firstList) && j < len(secondList) {
start := max(firstList[i][0], secondList[j][0])
end := min(firstList[i][1], secondList[j][1])
if start <= end {
result = append(result, []int{start, end})
}
if firstList[i][1] < secondList[j][1] {
i++
} else {
j++
}
}
return result
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
Input: head = [1,2,2,1]
Output: true
func isPalindrome(head *ListNode) bool {
vals := []int{}
currentNode := head
for currentNode != nil {
vals = append(vals, currentNode.Val)
currentNode = currentNode.Next
}
front := 0
back := len(vals) - 1
for front < back {
if vals[front] != vals[back] {
return false
}
front++
back--
}
return true
}
Input: digits = ["1","3","5","7"], n = 100
Output: 20
package main
import (
"math"
"strconv"
)
func atMostNGivenDigitSet(digits []string, n int) int {
s := strconv.Itoa(n)
K := len(s)
dp := make([]int, K+1)
dp[K] = 1
for i := K - 1; i >= 0; i-- {
for _, d := range digits {
if d[0] < s[i] {
dp[i] += int(math.Pow(float64(len(digits)), float64(K-i-1)))
} else if d[0] == s[i] {
dp[i] += dp[i+1]
}
}
}
for i := 1; i < K; i++ {
dp[0] += int(math.Pow(float64(len(digits)), float64(i)))
}
return dp[0]
}
Input: grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
Output: 8
Explanation: There are 8 negatives number in the matrix.
func countNegatives(grid [][]int) int {
count := 0
for _, row := range grid {
for _, element := range row {
if element < 0 {
count++
}
}
}
return count
}
Input: nums = [9], target = 3
Output: 0
package main
func combinationSum4(nums []int, target int) int {
memo := make(map[int]int)
return combs(nums, target, memo)
}
func combs(nums []int, remain int, memo map[int]int) int {
if remain == 0 {
return 1
}
if val, found := memo[remain]; found {
return val
}
result := 0
for _, num := range nums {
if remain - num >= 0 {
result += combs(nums, remain - num, memo)
}
}
memo[remain] = result
return result
}
Input: slots1 = [[10,50],[60,120],[140,210]], slots2 = [[0,15],[60,70]], duration = 8
Output: [60,68]
func minAvailableDuration(slots1 [][]int, slots2 [][]int, duration int) []int {
sort.Slice(slots1, func(i, j int) bool {
return slots1[i][0] < slots1[j][0]
})
sort.Slice(slots2, func(i, j int) bool {
return slots2[i][0] < slots2[j][0]
})
pointer1, pointer2 := 0, 0
for pointer1 < len(slots1) && pointer2 < len(slots2) {
intersectLeft := max(slots1[pointer1][0], slots2[pointer2][0])
intersectRight := min(slots1[pointer1][1], slots2[pointer2][1])
if intersectRight - intersectLeft >= duration {
return []int{intersectLeft, intersectLeft + duration}
}
if slots1[pointer1][1] < slots2[pointer2][1] {
pointer1++
} else {
pointer2++
}
}
return []int{}
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
Input: nums = [1,4,3,2]
Output: 4
Explanation: All possible pairings (ignoring the ordering of elements) are:
1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
So the maximum possible sum is 4.
import "sort"
func arrayPairSum(nums []int) int {
sort.Ints(nums)
sum := 0
for i := 0; i < len(nums); i += 2 {
sum += nums[i]
}
return sum
}
Input: nums = [1], queries = [[4,0]]
Output: [0]
func sumEvenAfterQueries(nums []int, queries [][]int) []int {
evenSum := 0
for _, num := range nums {
if num % 2 == 0 {
evenSum += num
}
}
result := make([]int, len(queries))
for i, query := range queries {
val, index := query[0], query[1]
if nums[index] % 2 == 0 {
evenSum -= nums[index]
}
nums[index] += val
if nums[index] % 2 == 0 {
evenSum += nums[index]
}
result[i] = evenSum
}
return result
}
Input: grid = [[1,0,1],[0,0,0],[1,0,1]]
Output: 2
Explanation: The cell (1, 1) is as far as possible from all the land with distance 2.
func maxDistance(grid [][]int) int {
directions := [][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
visited := make([][]int, len(grid))
for i := range grid {
visited[i] = make([]int, len(grid[i]))
copy(visited[i], grid[i])
}
q := [][2]int{}
for i := 0; i < len(grid); i++ {
for j := 0; j < len(grid[i]); j++ {
if grid[i][j] == 1 {
q = append(q, [2]int{i, j})
}
}
}
distance := -1
for len(q) > 0 {
qSize := len(q)
for qSize > 0 {
landCell := q[0]
q = q[1:]
for _, dir := range directions {
x, y := landCell[0]+dir[0], landCell[1]+dir[1]
if x >= 0 && y >= 0 && x < len(grid) && y < len(grid[0]) && visited[x][y] == 0 {
visited[x][y] = 1
q = append(q, [2]int{x, y})
}
}
qSize--
}
distance++
}
if distance == 0 {
return -1
}
return distance
}
func maxDistance(grid [][]int) int {
directions := [][2]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
visited := make([][]int, len(grid))
for i := range grid {
visited[i] = make([]int, len(grid[i]))
copy(visited[i], grid[i])
}
q := [][2]int{}
for i := 0; i < len(grid); i++ {
for j := 0; j < len(grid[i]); j++ {
if grid[i][j] == 1 {
q = append(q, [2]int{i, j})
}
}
}
distance := -1
for len(q) > 0 {
qSize := len(q)
for qSize > 0 {
landCell := q[0]
q = q[1:]
for _, dir := range directions {
x, y := landCell[0]+dir[0], landCell[1]+dir[1]
if x >= 0 && y >= 0 && x < len(grid) && y < len(grid[0]) && visited[x][y] == 0 {
visited[x][y] = 1
q = append(q, [2]int{x, y})
}
}
qSize--
}
distance++
}
if distance == 0 {
return -1
}
return distance
}
Input: source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]
Output: ["int main()","{ "," ","int a, b, c;","a = b + c;","}"]
package main
import (
"strings"
)
func removeComments(source []string) []string {
inBlock := false
var buffer strings.Builder
var result []string
for _, line := range source {
i := 0
if !inBlock {
buffer.Reset()
}
for i < len(line) {
if !inBlock && i + 1 < len(line) && line[i:i+2] == "/*" {
inBlock = true
i++
} else if inBlock && i + 1 < len(line) && line[i:i+2] == "*/" {
inBlock = false
i++
} else if !inBlock && i + 1 < len(line) && line[i:i+2] == "//" {
break
} else if !inBlock {
buffer.WriteByte(line[i])
}
i++
}
if !inBlock && buffer.Len() > 0 {
result = append(result, buffer.String())
}
}
return result
}
Input: emails = ["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
Output: 2
using System;
using System.Collections.Generic;
public class Solution {
public int NumUniqueEmails(string[] emails) {
var uniqueEmails = new HashSet();
foreach (var email in emails) {
var parts = email.Split('@');
var local = parts[0].Split('+')[0].Replace(".", "");
uniqueEmails.Add($"{local}@{parts[1]}");
}
return uniqueEmails.Count;
}
}
Количество байтов | UTF-8 Октетная последовательность
| (бинарная)
--------------------+-----------------------------------------
1 | 0xxxxxxx
2 | 110xxxxx 10xxxxxx
3 | 1110xxxx 10xxxxxx 10xxxxxx
4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Input: data = [197,130,1]
Output: true
Explanation: data represents the octet sequence: 11000101 10000010 00000001.
It is a valid utf-8 encoding for a 2-bytes character followed by a 1-byte character.
package main
import (
"fmt"
)
func validUtf8(data []int) bool {
nBytes := 0
for _, num := range data {
binRep := fmt.Sprintf("%08b", num)[-8:]
if nBytes == 0 {
for _, bit := range binRep {
if bit == '0' {
break
}
nBytes++
}
if nBytes == 0 {
continue
}
if nBytes == 1 || nBytes > 4 {
return false
}
} else {
if !(binRep[0] == '1' && binRep[1] == '0') {
return false
}
}
nBytes--
}
return nBytes == 0
}
func main() {
data1 := []int{197, 130, 1}
data2 := []int{235, 140, 4}
fmt.Println(validUtf8(data1)) // true
fmt.Println(validUtf8(data2)) // false
}