Խնդիր 1
Min Max Game
Ձեզ տրվում է 0 ինդեքսավորված ամբողջ թվային զանգված
nums
, որի երկարությունը2
հզորություն է:
Կիրառեք հետևյալ ալգորիթմը
nums
-ի վրա.
Թող
n
լինիnums
-ի երկարությունը: Եթե n == 1
, ապա ավարտեք գործընթացը: Հակառակ դեպքում, ստեղծեք նոր 0-ինդեքսավորվածnewNums
n / 2
երկարությամբ ամբողջ թվային զանգված:
Յուրաքանչյուր զույգ
i
ինդեքսի համար, որտեղ0 <= i < n / 2
, նշանակեքnewNums[i]
արժեքը որպեսmin(nums[2 * i], nums[2 * i + 1])
:
Յուրաքանչյուր կենտ
i
ինդեքսի համար, որտեղ0 <= i < n / 2
, նշանակելnewNums[i]
արժեքը որպեսmax(nums[2 * i], nums[2 * i + 1])
:
Փոխարինել
nums
զանգվածըnewNums
-ով:
Կրկնեք ամբողջ գործընթացը՝ սկսած 1-ին քայլից:
Ալգորիթմը կիրառելուց հետո վերադարձրեք վերջին թիվը, որը մնում է
nums
-ում:
Մոտեցում
Լուծումը պարզ իրականացումն է, ինչպես նկարագրված է խնդրի մեջ:
- զույգ ինդեքսի համար մենք վերցնում ենք նվազագույնը nums[2*i] և nums[2*i + 1]
- կենտ ինդեքսի համար մենք վերցնում ենք առավելագույնը nums[2*i] և nums[2*i + 1]
Մենք դա անում ենք այնքան ժամանակ, քանի դեռ զանգվածում միայն մեկ թիվ կա:
Լուծում
Ժամանակի բարդություն՝ O(n)
Տիեզերական բարդություն՝ O(n)
Խնդիր 2
Բաժանման զանգված այնպիսին, որ առավելագույն տարբերությունը K է
Ձեզ տրվում է
nums
ամբողջ զանգված ևk
ամբողջ թիվ: Դուք կարող եքnums
-ը բաժանել մեկ կամ ավելի ենթահաջորդությունների այնպես, որnums
-ի յուրաքանչյուր տարր հայտնվի ճիշտ ենթահերթականներից մեկում:
Վերադարձրեք նվազագույնենթահաջորդականությունների քանակը, որոնք անհրաժեշտ են այնպես, որ յուրաքանչյուր ենթահաջորդության առավելագույն և նվազագույն արժեքների տարբերությունը լինի առավելագույնը
k
:
ենթահաջորդականությունը այն հաջորդականությունն է, որը կարող է ստացվել մեկ այլ հաջորդականությունից՝ ջնջելով որոշ կամ ոչ մի տարրեր՝ առանց մնացած տարրերի հերթականությունը փոխելու:
Մոտեցում
Տարրերը խմբավորելու պայմանն է՝ առավելագույն և նվազագույն տարրերի միջև տարբերությունը պետք է լինի ≤ k: Մենք դասավորում ենք զանգվածը և օգտագործում ենք երկու ցուցիչի մոտեցում, ամրագրում ենք առաջին ցուցիչի դիրքը և տեղափոխում երկրորդ ցուցիչը այնքան ժամանակ, մինչև երկու ցուցիչների միջև եղած տարրերի տարբերությունը լինի ≤ k: Երբ պայմանը ձախողվում է, մենք թարմացնում ենք առաջին ցուցիչի դիրքը և կրկնում ենք գործընթացը: Ենթահաջորդությունների թիվը առաջին ցուցիչի թարմացման քանակն է:
Լուծում
Ժամանակի բարդություն՝ O(nlogn)
Տիեզերական բարդություն՝ O(1)
Խնդիր 3
Փոխարինել տարրերը զանգվածում
Ձեզ տրվում է 0 ինդեքսավորված զանգված
nums
, որը բաղկացած էn
տարբերակ դրական ամբողջ թվերից: Կիրառեքm
գործողությունները այս զանգվածի վրա, որտեղith
գործողության մեջoperations[i][0]
թիվը փոխարինում եքoperations[i][1]
-ով:
Երաշխավորված է, որ
ith
գործողության մեջ.
operations[i][0]
կաnums
-ում:
operations[i][1]
nums
-ում չկա:
Վերադարձրեք բոլոր գործողությունները կիրառելուց հետո ստացված զանգվածը:
Մոտեցում
Մենք պահպանում ենք արժեք՝ տվյալ զանգվածի յուրաքանչյուր տարրի համար ինդեքսավորելու համար: Յուրաքանչյուր թարմացման գործողության համար մենք գտնում ենք գործողության[i][0] ինդեքսը և թարմացնում արժեքը nums[operation[i][0]]-ում մինչև : գործողություն[i][1]և թարմացրեք նաև ինդեքսային քարտեզագրիչը:
Լուծում
Ժամանակի բարդություն՝ O(n)
Տիեզերական բարդություն՝ O(n)
Խնդիր 4
Տեքստային խմբագրի նախագծում
Նախագծեք տեքստային խմբագրիչ կուրսորով, որը կարող է անել հետևյալը.
Ավելացրեք տեքստ այն վայրում, որտեղ գտնվում է կուրսորը:
Ջնջել տեքստը այն վայրից, որտեղ գտնվում է կուրսորը (նմանացնելով backspace ստեղնը):
Տեղափոխեք կուրսորը ձախ կամ աջ:
Տեքստը ջնջելիս կջնջվեն միայն կուրսորից ձախ կողմում գտնվող նիշերը: Կուրսորը նույնպես կմնա իրական տեքստի մեջ և չի կարող տեղափոխվել դրանից այն կողմ: Ավելի ֆորմալ առումով, մենք ունենք, որ
0 <= cursor.position <= currentText.length
-ը միշտ պահպանվում է:
Իրականացնել
TextEditor
դասը.
TextEditor()
Նախնականացնում է օբյեկտը դատարկ տեքստով:
void addText(string text)
Ավելացնում էtext
կուրսորը: Կուրսորն ավարտվում էtext
-ի աջ կողմում:
int deleteText(int k)
Ջնջում է կուրսորի ձախ կողմում գտնվողk
նիշերը: Վերադարձնում է իրականում ջնջված նիշերի թիվը:
string cursorLeft(int k)
Կուրսորըk
անգամ տեղափոխում է ձախ: Վերադարձնում է վերջինmin(10, len)
նիշերը կուրսորի ձախ կողմում, որտեղlen
կուրսորից ձախ նիշերի թիվն է:
string cursorRight(int k)
Կուրսորըk
անգամ տեղափոխում է աջ: Վերադարձնում է վերջինmin(10, len)
նիշերը կուրսորի ձախ կողմում, որտեղlen
կուրսորից ձախ նիշերի թիվն է:
Մոտեցում
Մենք կարող ենք օգտագործել երկու կույտ մոտեցում: lstack և rstack: Կուրսորը միշտ կլինի lstack-ի վերևում:
- ԱվելացնելՏրված տեքստը կկցվի lstack-ին:
- Ջնջել Մենք ջնջում ենք նիշերը lstack-ից մինչև k-ը հասնի 0-ի, իսկ lstack-ը դատարկ չէ:
- Տեղափոխեք կուրսորը ձախ Կուրսորը տեղափոխեք ձախ իմաստով, վերևի ցուցիչը տեղափոխեք, որից ներքև, ոչ այլ ինչ է, քան տարրը lstack-ից դուրս հանելը: Բացված տարրերը կպահվեն rstack-ում:
- Տեղափոխեք կուրսորը աջ Կուրսորը տեղափոխեք ճիշտ իմաստով, տեղափոխեք վերևի ցուցիչը, որի վերևում գտնվող ցուցիչը ոչ այլ ինչ է, քան տարրը rstack-ից դուրս հանելը: Բացված տարրերը կպահվեն lstack-ում:
Լուծում
Ժամանակի բարդություն. O(n), որտեղ n-ը ավելացված, ջնջված նիշերի կամ կուրսորը տեղափոխվող դիրքերի թիվն է:
Տիեզերքի բարդություն. O(n), որտեղ n-ը նիշերի ընդհանուր քանակն է, որոնք պահվում են կույտից որևէ մեկում:
Հուսով եմ, տղաներ, այս գրառումը ձեզ դուր եկավ:
Եթե գտնում եք, որ դա օգտակար է, խնդրում ենք տարածել և ծափերը շատ գնահատելի են: 😄
Զգացեք ձեր հարցերը տալ մեկնաբանությունների բաժնում: