Golang | LeetCode
3.93K subscribers
180 photos
1.08K links
Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.iss.one/+MVqzqT6ZzFFhYjhi
Вопросы собесов t.iss.one/+ajHN0OKU1okyZDky
Вакансии t.iss.one/+mX_RBWjiMTExODUy
Download Telegram
#hard
Задача: 679. 24 Game

Дан массив целых чисел cards длиной 4. У вас есть четыре карты, каждая из которых содержит число в диапазоне от 1 до 9. Вам нужно расположить числа на этих картах в математическом выражении, используя операторы ['+', '-', '*', '/'] и скобки '(' и ')' так, чтобы получить значение 24.

Вы ограничены следующими правилами:

Оператор деления '/' представляет собой реальное деление, а не целочисленное деление.
Например, 4 / (1 - 2 / 3) = 4 / (1 / 3) = 12.
Каждая операция выполняется между двумя числами. В частности, мы не можем использовать '-' как унарный оператор.
Например, если cards = [1, 1, 1, 1], выражение "-1 - 1 - 1 - 1" не допускается.
Вы не можете объединять числа вместе.
Например, если cards = [1, 2, 1, 2], выражение "12 + 12" недопустимо.
Вернуть true, если вы можете получить такое выражение, которое оценивается в 24, и false в противном случае.

Пример:
Input: cards = [4,1,8,7]
Output: true
Explanation: (8-4) * (7-1) = 24


👨‍💻 Алгоритм:

1⃣Создайте функцию generatePossibleResults(a, b), которая возвращает массив результатов всех возможных математических операций над двумя числами.

2⃣ Создайте функцию checkIfResultReached(list), чтобы проверить, можем ли мы достичь результата 24, используя текущий массив list. Сначала проверьте базовые условия: если размер массива равен 1, верните true, если результат равен 24, иначе верните false.

3⃣Если размер массива больше 1, выберите любые два числа из списка, выполните все математические операции над ними, создайте новый список с обновленными элементами и снова вызовите рекурсивную функцию с этим новым списком. Если ни одна комбинация не приводит к результату 24, верните false. Вызовите checkIfResultReached с исходным списком карт.

😎 Решение:
package main

import (
"math"
)

type Solution struct{}

func (s *Solution) generatePossibleResults(a, b float64) []float64 {
res := []float64{a + b, a - b, b - a, a * b}
if a != 0 {
res = append(res, b/a)
}
if b != 0 {
res = append(res, a/b)
}
return res
}

func (s *Solution) checkIfResultReached(list []float64) bool {
if len(list) == 1 {
return math.Abs(list[0]-24) <= 0.1
}

for i := 0; i < len(list); i++ {
for j := i + 1; j < len(list); j++ {
newList := make([]float64, 0, len(list)-1)
for k := 0; k < len(list); k++ {
if k != i && k != j {
newList = append(newList, list[k])
}
}
for _, res := range s.generatePossibleResults(list[i], list[j]) {
newList = append(newList, res)
if s.checkIfResultReached(newList) {
return true
}
newList = newList[:len(newList)-1]
}
}
}
return false
}

func (s *Solution) judgePoint24(cards []int) bool {
list := make([]float64, len(cards))
for i, card := range cards {
list[i] = float64(card)
}
return s.checkIfResultReached(list)
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
#hard
Задача: 363. Max Sum of Rectangle No Larger Than K

Дана матрица размером m x n и целое число k, вернуть максимальную сумму прямоугольника в матрице, такая что его сумма не превышает k.

Гарантируется, что будет прямоугольник с суммой, не превышающей k.

Пример:
Input: matrix = [[1,0,1],[0,-2,3]], k = 2
Output: 2
Explanation: Because the sum of the blue rectangle [[0, 1], [-2, 3]] is 2, and 2 is the max number no larger than k (k = 2).


👨‍💻 Алгоритм:

1⃣Создать вспомогательную функцию updateResult, которая будет находить максимальную сумму подмассива в одномерном массиве, не превышающую k.

2⃣Преобразовать каждую подматрицу в одномерный массив и применить к ней функцию updateResult.

3⃣Вернуть максимальную найденную сумму.

😎 Решение:
package main

import (
"math"
"sort"
)

type Solution struct {
result int
}

func Constructor() Solution {
return Solution{result: math.MinInt32}
}

func (this *Solution) updateResult(nums []int, k int) {
sum := 0
sortedSum := []int{0}

for _, num := range nums {
sum += num
idx := sort.Search(len(sortedSum), func(i int) bool { return sortedSum[i] >= sum-k })
if idx < len(sortedSum) {
this.result = int(math.Max(float64(this.result), float64(sum-sortedSum[idx])))
}
sortedSum = append(sortedSum, sum)
sort.Ints(sortedSum)
}
}

func (this *Solution) maxSumSubmatrix(matrix [][]int, k int) int {
rows := len(matrix)
cols := len(matrix[0])

for i := 0; i < rows; i++ {
rowSum := make([]int, cols)
for row := i; row < rows; row++ {
for col := 0; col < cols; col++ {
rowSum[col] += matrix[row][col]
}
this.updateResult(rowSum, k)
if this.result == k {
return this.result
}
}
}
return this.result
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
#hard
Задача: 446. Arithmetic Slices II - Subsequence


Дан целочисленный массив nums, вернуть количество всех арифметических подпоследовательностей nums.

Последовательность чисел называется арифметической, если она состоит как минимум из трех элементов и если разница между любыми двумя последовательными элементами одинаковая.

Например, [1, 3, 5, 7, 9], [7, 7, 7, 7] и [3, -1, -5, -9] являются арифметическими последовательностями.
Например, [1, 1, 2, 5, 7] не является арифметической последовательностью.
Подпоследовательность массива - это последовательность, которая может быть образована путем удаления некоторых элементов (возможно, ни одного) из массива.

Например, [2, 5, 10] является подпоследовательностью [1, 2, 1, 2, 4, 1, 5, 10].
Тестовые случаи сгенерированы таким образом, что ответ помещается в 32-битное целое число.

Пример:
Input: nums = [2,4,6,8,10]
Output: 7
Explanation: All arithmetic subsequence slices are:
[2,4,6]
[4,6,8]
[6,8,10]
[2,4,6,8]
[4,6,8,10]
[2,4,6,8,10]
[2,6,10]


👨‍💻 Алгоритм:

1⃣Мы можем использовать поиск в глубину (DFS) для генерации всех подпоследовательностей.

2⃣Мы можем проверить, является ли подпоследовательность арифметической, согласно ее определению.

3⃣Возвращаем количество всех арифметических подпоследовательностей.

😎 Решение:
type Solution struct {
n int
ans int
}

func (sol *Solution) dfs(dep int, A []int, cur []int64) {
if dep == sol.n {
if len(cur) < 3 {
return
}
for i := 1; i < len(cur); i++ {
if cur[i]-cur[i-1] != cur[1]-cur[0] {
return
}
}
sol.ans++
return
}
sol.dfs(dep+1, A, cur)
cur = append(cur, int64(A[dep]))
sol.dfs(dep+1, A, cur)
cur = cur[:len(cur)-1]
}

func numberOfArithmeticSlices(A []int) int {
sol := Solution{n: len(A), ans: 0}
sol.dfs(0, A, []int64{})
return sol.ans
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM