LmaoSuVuong
Senior Member
cảm giác nó đúng thì làm - greedy xài từ sang hơn thì là thuật giải
Sửa lần cuối:
cảm giác nó đúng thì làm - greedy xài từ sang hơn thì là thuật giải
Bruteforce thím
học về priority queue và làm mấy bài về dạng đó trước đi đã.
function longestDiverseString(a: number, b: number, c: number): string {
let result = ''
const arr = [];
arr.push(
{ val: a, label: 'a' },
{ val: b, label: 'b' },
{ val: c, label: 'c' }
)
const getQuatity = (numb: number) => {
return numb > 1 ? 2 : 1
}
arr.sort((a, b) => b.val - a.val)
let prev = ''
while (true) {
let curMax = arr[0];
let quatity = 0;
if (prev == curMax.label) {
curMax = arr[1];
quatity = 1
};
if (curMax.val < 1) break;
quatity = quatity ? quatity : getQuatity(curMax.val)
result += curMax.label.repeat(quatity);
curMax.val -= quatity
prev = curMax.label;
arr.sort((a, b) => b.val - a.val)
}
return result;
};
Phải có tính năng tắt cái hiện testcase bị sai đi, chứ làm leetcode nhiều làm mình lười suy nghĩ edge case trước khi code, hư hết cả người,dạo ni làm bài ẩu quá, toàn feeling với pass là dc + với bọn lc ra feature tính hộ time complexity cảm giác chệch hướng mục đích làm leetcode, edge case toàn chờ submit xem có bọ ko mới sửa. từ mai điểm danh sẽ tính toán kỹ phần Tc, Sc.
bác lào đăng bài làm thì title nhớ kèm Tc, Sc nữa nhé![]()

Bạn có thể chia sẻ cách nhìn ra thuật toán tham lam khi gặp một bài toán bất kỳ được không ?Thường sẽ nháp ra rồi đặt câu hỏi, ví dụ có 4A 1B thì phải đặt A trước vì nếu đặt B trước sẽ ko đủ kí tự để cắt cái A ra thành 1 valid string, có cái này rồi code greedily luôn 10ph là xong 1 bài
Mà greedy thường là phần khó nhất trong leetcode cmnr nên fence làm ko ra thì cũng bt thôi
Còn backtrack thì fence chỉ nên nghĩ tới khi đề nó cho cái constrain nào n<15 thôi
via theNEXTvoz for iPhone
public class Solution
{
public string LongestDiverseString(int a, int b, int c)
{
int[] remains = new int[] {a, b, c};
StringBuilder result = new();
while (true)
{
int exclude = -1;
if (2 <= result.Length)
{
if (result[^1] == result[^2])
{
exclude = result[^1] - 'a';
}
}
int letter = GetLetter(remains, exclude);
if (letter == -1)
{
break;
}
result.Append((char)(letter + 'a'));
}
return result.ToString();
}
private int GetLetter(int[] remains, int exclude)
{
int candidate = 0;
int max = 0;
for (int i = 0; i < remains.Length; i++)
{
if (i == exclude)
{
continue;
}
int remain = remains[i];
if (max < remain)
{
candidate = i;
max = remain;
}
}
if (max == 0)
{
return -1;
}
remains[candidate]--;
return candidate;
}
}
Không vì mình cũng ko biết, fence qua hỏi mấy fence bên topic kia đi, toàn pro ko bên đấyBạn có thể chia sẻ cách nhìn ra thuật toán tham lam khi gặp một bài toán bất kỳ được không ?

Mình hỏi nghiêm túc không đùa.Không vì mình cũng ko biết, fence qua hỏi mấy fence bên topic kia đi, toàn pro ko bên đấy![]()
Chắc fen troll chứ mình thấy fen rating cũng cao vl mà
via theNEXTvoz for iPhone
Vấn đề với greedy là nhiều lúc mình cũng ko hiểu sao nó đúng và cũng ko chứng minh được là nó đúng hoặc cần rất nhiều thời gian để chứng minh, nhưng mà nó vẫn cho ra kết quả chính xác.Mình hỏi nghiêm túc không đùa.
class Solution:
def maximumSwap(self, num: int) -> int:
ans = num
num = str(num)
n = len(num)
digits = [num[i] for i in range(n)]
for i in range(n):
for j in range(i + 1, n):
if digits[i] < digits[j]:
digits[i], digits[j] = digits[j], digits[i]
ans = max(ans, int(''.join(digits)))
digits[i], digits[j] = digits[j], digits[i]
return ans
class Solution:
def maximumSwap(self, num: int) -> int:
ans = num
def toDigitArr(num):
base = 10
arr = []
while num > 0:
arr.append(num%10)
num//=10
base*=10
return arr[::-1]
def toInt(arr):
ans = 0
n = len(arr)
for i in range(n):
ans = ans*10 + arr[i]
return ans
digits = toDigitArr(num)
n = len(digits)
for i in range(n):
for j in range( i + 1, n):
if digits[i] < digits[j]:
digits[i], digits[j] = digits[j], digits[i]
ans = max(ans, toInt(digits))
digits[i], digits[j] = digits[j], digits[i]
return ans
class Solution:
def maximumSwap(self, num: int) -> int:
digits = list(str(num))
n = len(digits)
rightMax = [-1]*n
rightMax[n - 1] = n - 1
for i in range(n - 2, -1, -1):
rightMax[i] = rightMax[i + 1] if digits[i] <= digits[rightMax[i + 1]] else i
for i in range(n):
if digits[i] < digits[rightMax[i]]:
digits[i], digits[rightMax[i]] = digits[rightMax[i]], digits[i]
return int(''.join(digits))
return num



chuyến tàu đi như thế nào đấy bác.Hụt chuyến tàu canada rồi, ở lại Việt Nam cày leetcode thôi![]()
class Solution {
public:
int maximumSwap(int num) {
priority_queue<int> pq;
vector<int> tmp;
while (num > 0) {
int temp = num % 10;
pq.push(temp);
tmp.push_back(temp);
num /= 10;
}
int n = pq.size();
for (int i = 0; i < n/2; i++) {
int temp = tmp[i];
tmp[i] = tmp[n - i - 1];
tmp[n - i - 1] = temp;
}
for (int i = 0; i < n; i++) {
if (tmp[i] != pq.top()) {
for (int j = n - 1; j > i; j--) {
if (tmp[j] == pq.top()) {
int x = tmp[i];
tmp[i] = tmp[j];
tmp[j] = x;
break;
}
}
break;
}
else if (tmp[i] == pq.top()) {
pq.pop();
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans += tmp[i];
if (i != n - 1) {
ans *= 10;
}
}
return ans;
}
};
Sao thế bác, có biến gì àHụt chuyến tàu canada rồi, ở lại Việt Nam cày leetcode thôi![]()
class Solution {
public:
int maximumSwap(int num) {
string s = to_string(num);
vector<char> max_num(s.size()+1);
max_num[s.size()] = s.size()-1;
for (int i = s.size() - 1; i >= 0; i--) {
max_num[i] = i;
if (s[i] <= s[max_num[i+1]]) {
max_num[i] = max_num[i+1];
}
}
for (int i = 0; i < s.size() - 1; i++) {
if (s[i] < s[max_num[i+1]]) {
swap(s[i], s[max_num[i+1]]);
break;
}
}
return stoi(s);
}
};
function maximumSwap(num: number): number {
const digits: number[] = num.toString().split('').map(Number);
const idxes: number[] = new Array(10).fill(-1);
for (let i = 0; i < digits.length; i++) {
idxes[digits[i]] = i;
}
for (let i = 0; i < digits.length; i++) {
for (let j = 9; j > digits[i]; j--) {
if (idxes[j] > i) {
[digits[i], digits[idxes[j]]] = [digits[idxes[j]], digits[i]];
return parseInt(digits.join(''));
}
}
}
return num;
}
Ngày xưa mình từng đọc ở đâu đó(hình như là vnoi), 1 hiền nhân đã tổng quát về tham lam bằng vài ý:Bạn có thể chia sẻ cách nhìn ra thuật toán tham lam khi gặp một bài toán bất kỳ được không ?
