判別首字母縮略詞
給你一個字符串?dāng)?shù)組 words 和一個字符串 s ,請你判斷 s 是不是 words 的 首字母縮略詞 。
如果可以按順序串聯(lián) words 中每個字符串的第一個字符形成字符串 s ,則認為 s 是 words 的首字母縮略詞。例如,“ab” 可以由 [“apple”, “banana”] 形成,但是無法從 [“bear”, “aardvark”] 形成。
如果 s 是 words 的首字母縮略詞,返回 true ;否則,返回 false 。
示例 1:
輸入:words = [“alice”,“bob”,“charlie”], s = “abc”
輸出:true
解釋:words 中"alice"、“bob” 和 “charlie” 的第一個字符分別是 ‘a(chǎn)’、‘b’ 和 ‘c’。因此,s = "abc"是首字母縮略詞。
示例 2:
輸入:words = [“an”,“apple”], s = “a”
輸出:false
解釋:words 中 “an” 和 "apple"的第一個字符分別是 ‘a(chǎn)’ 和 ‘a(chǎn)’。 串聯(lián)這些字符形成的首字母縮略詞是 “aa” 。 因此,s = “a” 不是首字母縮略詞。
示例 3:
輸入:words = [“never”,“gonna”,“give”,“up”,“on”,“you”], s = “ngguoy”
輸出:true
解釋:串聯(lián)數(shù)組 words 中每個字符串的第一個字符,得到字符串 “ngguoy” 。 因此,s = "ngguoy"是首字母縮略詞。
提示:
1
<
=
w
o
r
d
s
.
l
e
n
g
t
h
<
=
100
1 <= words.length <= 100
1<=words.length<=100
1
<
=
w
o
r
d
s
[
i
]
.
l
e
n
g
t
h
<
=
10
1 <= words[i].length <= 10
1<=words[i].length<=10
1
<
=
s
.
l
e
n
g
t
h
<
=
100
1 <= s.length <= 100
1<=s.length<=100
words[i] 和 s 由小寫英文字母組成
思路:
簡單模擬題,直接按照題意取出每個單詞的首字母,拼接起來,判斷和字符串s是否相等即可。
代碼:
class Solution {
public:
bool isAcronym(vector<string>& words, string s) {
string res;
for(auto word:words){
res+=word[0];
}
return res==s;
}
};
k-avoiding 數(shù)組的最小總和
給你兩個整數(shù) n 和 k 。
對于一個由不同正整數(shù)組成的數(shù)組,如果其中不存在任何求和等于 k 的不同元素對,則稱其為 k-avoiding 數(shù)組。
返回長度為 n 的 k-avoiding 數(shù)組的可能的最小總和。
示例 1:
輸入:n = 5, k = 4
輸出:18
解釋:設(shè)若 k-avoiding 數(shù)組為 [1,2,4,5,6] ,其元素總和為 18 ??梢宰C明不存在總和小于 18 的 k-avoiding 數(shù)組。
示例 2:
輸入:n = 2, k = 6
輸出:3
解釋:可以構(gòu)造數(shù)組 [1,2] ,其元素總和為 3 。 可以證明不存在總和小于 3 的k-avoiding 數(shù)組。
提示:
1
<
=
n
,
k
<
=
50
1 <= n, k <= 50
1<=n,k<=50
思路:
簡單模擬題,需要構(gòu)造一個長度為n的數(shù)組,滿足不存在求和等于k的兩個元素。數(shù)據(jù)范圍很小,那么直接從1開始枚舉,將每個數(shù)插入數(shù)組之前,判斷該數(shù)字插入是否會和之前的數(shù)字相加等于k,不會等于k才能插入數(shù)組中。
代碼:
class Solution {
public:
bool Find(vector<int>p,int x,int k){
for(auto a:p){
if(a==k-x)return 1;
}
return 0;
}
int minimumSum(int n, int k) {
int x=1,sum=0;
vector<int>p;
while(p.size()<n){
if(!Find(p,x,k)){
sum+=x;
p.push_back(x++);
}
else x++;
}
return sum;
}
};
銷售利潤最大化
給你一個整數(shù) n 表示數(shù)軸上的房屋數(shù)量,編號從 0 到 n - 1 。
另給你一個二維整數(shù)數(shù)組 offers ,其中
o
f
f
e
r
s
[
i
]
=
[
s
t
a
r
t
i
,
e
n
d
i
,
g
o
l
d
i
]
offers[i] = [start_i, end_i, gold_i]
offers[i]=[starti?,endi?,goldi?] 表示第
i
i
i 個買家想要以
g
o
l
d
i
gold_i
goldi? 枚金幣的價格購買從
s
t
a
r
t
i
start_i
starti? 到
e
n
d
i
end_i
endi? 的所有房屋。
作為一名銷售,你需要有策略地選擇并銷售房屋使自己的收入最大化。
返回你可以賺取的金幣的最大數(shù)目。
注意 同一所房屋不能賣給不同的買家,并且允許保留一些房屋不進行出售。
示例 1:
輸入:n = 5, offers = [[0,0,1],[0,2,2],[1,3,2]]
輸出:3
解釋:有 5 所房屋,編號從 0 到4 ,共有 3 個購買要約。 將位于 [0,0] 范圍內(nèi)的房屋以 1 金幣的價格出售給第 1 位買家,并將位于 [1,3] 范圍內(nèi)的房屋以2 金幣的價格出售給第 3 位買家。 可以證明我們最多只能獲得 3 枚金幣。
示例 2:
輸入:n = 5, offers = [[0,0,1],[0,2,10],[1,3,2]]
輸出:10
解釋:有 5 所房屋,編號從 0 到4 ,共有 3 個購買要約。 將位于 [0,2] 范圍內(nèi)的房屋以 10 金幣的價格出售給第 2 位買家。 可以證明我們最多只能獲得 10枚金幣。
提示:
1
<
=
n
<
=
1
0
5
1 <= n <= 10^5
1<=n<=105
o
f
f
e
r
s
[
i
]
.
l
e
n
g
t
h
=
=
3
offers[i].length == 3
offers[i].length==3
0
<
=
s
t
a
r
t
i
<
=
e
n
d
i
<
=
n
?
1
0 <= starti <= endi <= n - 1
0<=starti<=endi<=n?1
1
<
=
g
o
l
d
i
<
=
1
0
3
1 <= goldi <= 10^3
1<=goldi<=103
思路:
動態(tài)規(guī)劃,dp[i+1]表示購買編號不超過i的房屋所能獲得的最大利益。
- 若不購買, d p [ i + 1 ] = d p [ i ] dp[i+1]=dp[i] dp[i+1]=dp[i]
- 若購買,那么遍歷所有
e
n
d
j
=
i
end_j=i
endj?=i的買家請求,
d
p
[
i
+
1
]
=
m
a
x
(
d
p
[
i
+
1
]
,
d
p
[
s
t
a
r
t
j
]
+
g
o
l
d
j
)
dp[i+1]=max(dp[i+1],dp[start_j]+gold_j)
dp[i+1]=max(dp[i+1],dp[startj?]+goldj?)
可以先將所有相同房屋結(jié)尾的購買請求,通過結(jié)尾房屋編號存儲起來。
d p [ i + 1 ] = m a x { d p [ i ] 不購買 i 房屋 d p [ i + 1 ] = d p [ s t a r t j ] + g o l d j 購買 i 房屋 dp[i+1]=max\begin{cases} dp[i] & 不購買i房屋 \\ dp[i+1]=dp[start_j]+gold_j & 購買i房屋 \\ \end{cases} dp[i+1]=max{dp[i]dp[i+1]=dp[startj?]+goldj??不購買i房屋購買i房屋?
代碼:
class Solution {
public:
int maximizeTheProfit(int n, vector<vector<int>>& offers){
//dp[i]維護的是只賣到第i個房子的收益
vector<vector<pair<int, int>>>tmp(n);
for(auto offer:offers){
tmp[offer[1]].push_back({offer[0],offer[2]});
}
int dp[n+1];//dp[i+1]維護的就是買到第i個房子的收益
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
dp[i+1]=dp[i];//不買第i個房子,那么其收益最大就是dp[i]
for(auto pii:tmp[i]){
int start=pii.first,gold=pii.second;//買第i個房子
dp[i+1]=max(dp[i+1],dp[start]+gold);
}
}
return dp[n];
}
};
找出最長等值子數(shù)組
給你一個下標(biāo)從 0 開始的整數(shù)數(shù)組 nums 和一個整數(shù) k 。
如果子數(shù)組中所有元素都相等,則認為子數(shù)組是一個 等值子數(shù)組 。注意,空數(shù)組是 等值子數(shù)組 。
從 nums 中刪除最多 k 個元素后,返回可能的最長等值子數(shù)組的長度。
子數(shù)組 是數(shù)組中一個連續(xù)且可能為空的元素序列。
示例 1:
輸入:nums = [1,3,2,3,1,3], k = 3
輸出:3
解釋:最優(yōu)的方案是刪除下標(biāo) 2 和下標(biāo) 4 的元素。刪除后,nums 等于 [1, 3, 3, 3] 。 最長等值子數(shù)組從 i = 1 開始到 j = 3 結(jié)束,長度等于 3 ??梢宰C明無法創(chuàng)建更長的等值子數(shù)組。
示例 2:
輸入:nums = [1,1,2,2,1,1], k = 2
輸出:4
解釋:最優(yōu)的方案是刪除下標(biāo) 2 和下標(biāo) 3 的元素。 刪除后,nums 等于 [1, 1, 1, 1] 。 數(shù)組自身就是等值子數(shù)組,長度等于 4 。 可以證明無法創(chuàng)建更長的等值子數(shù)組。
提示:
1
<
=
n
u
m
s
.
l
e
n
g
t
h
<
=
1
0
5
1 <= nums.length <= 10^5
1<=nums.length<=105
1
<
=
n
u
m
s
[
i
]
<
=
n
u
m
s
.
l
e
n
g
t
h
1 <= nums[i] <= nums.length
1<=nums[i]<=nums.length
0
<
=
k
<
=
n
u
m
s
.
l
e
n
g
t
h
0 <= k <= nums.length
0<=k<=nums.length文章來源:http://www.zghlxwxcb.cn/news/detail-685816.html
分析:
分析題意,得知題目的目的就是需要刪除每兩個相同的數(shù)字之間不同的數(shù),在刪除k次的情況下,使得連續(xù)的相同的數(shù)字最多。那么我們可以存儲每一個數(shù)字出現(xiàn)的位置。對于每一個數(shù)字,因為我們找到刪除后,連續(xù)的該數(shù)字最多,比如說,對數(shù)字1
,我們可以先維護出每兩個1
之間的距離,那么我們的目的就是要找到一串距離,使得距離和小于k,且距離的個數(shù)最多。顯然可以用滑動窗口的方法,獲得滿足條件的答案。
代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-685816.html
class Solution {
public:
const int MAXN = 1e5+5;
int longestEqualSubarray(vector<int>& nums, int k) {
if(nums.size()==1)return 1;
vector<int>p[MAXN];
for(int i=0;i<nums.size();i++){
p[nums[i]].push_back(i);//先維護一下每個數(shù)字的位置
}
int res=1;
for(int i=1;i<=nums.size();i++){
int cnt=0,ans=0;
vector<int>q;
for(int j=1;j<p[i].size();j++){//維護每個數(shù)字兩兩之間的距離
q.push_back(p[i][j]-p[i][j-1]-1);
}
for(int l=0,r=0;r<q.size();){//雙指針,得到最多的距離
cnt+=q[r++];
while(cnt>k)cnt-=q[l++];
ans=max(ans,r-l+1);
}
res=max(res,ans);
}
return res;
}
};
到了這里,關(guān)于【LeetCode周賽】LeetCode第359場周賽的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!