Leetcode第227試合の週間試合の問題と解法
Leetcode第227週試合
1752.配列が並べ替えられ、回転して得られるかどうかを検査する配列を前後に接続し、条件を満たすサブ配列があればtrue を返す.
1753.石を除去した最大得点貪欲なアルゴリズムは、毎回最も多い2つの山の中から の値を取ります.法則を探す
1754.ディクショナリ順序の最大連結文字列を作成する貪欲アルゴリズム解決,注意すべきは等しい場合 である.
1755.最も目標値に近いサブシーケンスと元の配列を左右の2つの配列に分割し、この2つの配列のすべてのサブシーケンスの和をそれぞれ計算します.上記とを並べ替えて、1つは小さいから大きいまで、1つは大きいから小さいまで、それから2つの配列を2つのポインタで遍歴して、答えを更新すればいいです. ブログへようこそ:http://wy313.top/
1752.配列が並べ替えられ、回転して得られるかどうかを検査する
`nums` 。`nums` , `nums` , 。
`nums` ( 0 ) , `true` ; , `false` 。
** ** 。
** :** `A` `x` `B` , `A[i] == B[(i+x) % A.length]` , `%` 。
class Solution {
public boolean check(int[] nums) {
int len=nums.length;
if(len==0||len==1)return true;
int []source=new int[len*2];
for(int i=0;i<len;i++){
source[i]=nums[i];
}
for(int i=len,n=len*2;i<n;i++){
source[i]=nums[i-len];
}
int start=0,end=1;
while(end<len*2&&start-end!=len){
for(;end<len*2;end++){
if(source[end]<source[end-1])break;
}
if(end-start>=len)return true;
start++;
end=start+1;
}
if(end-start>=len)return true;
return false;
}
}
1753.石を除去した最大得点
, `a`、`b` `c` ** ** 。
** ** , `1` 。 ** ** , 。
`a` 、`b` `c` , ** ** 。
class Solution {
public int maximumScore(int a, int b, int c) {
int[]nums={
a,b,c};
Arrays.sort(nums);
int zero=0;
int count=0;
for(int i=0;i<3;i++)
if(nums[i]==0)
zero++;
while(zero<2){
zero=0;
nums[2]--;
nums[1]--;
count++;
Arrays.sort(nums);
for(int i=0;i<3;i++)
if(nums[i]==0)
zero++;
}
return count;
}
}
class Solution {
public int maximumScore(int a, int b, int c) {
if (a + b < c)
return a + b;
if (a + c < b)
return a + c;
if (b + c < a)
return b + c;
return (a + b + c) / 2;
}
}
1754.ディクショナリ順序の最大連結文字列を作成する
word1 word2 。 merge : word1 word2 , :
word1 , word1 merge , word1 。
,word1 = "abc" merge = "dv" , ,word1 = "bc" , merge = "dva" 。
word2 , word2 merge , word2 。
,word2 = "abc" merge = "" , ,word2 = "bc" , merge = "a" 。
merge 。
a b , a b ,a b , a b 。 ,"abcd" "abcc" , , d c 。
class Solution {
public String largestMerge(String w1, String w2) {
char[] csa = w1.toCharArray(), csb = w2.toCharArray();
int lena = csa.length, lenb = csb.length;
char[] ans = new char[lena + lenb];
int a = 0, b = 0, idx = 0;
while(a < lena || b < lenb) {
if(a >= lena) {
ans[idx++] = csb[b++];
} else if(b >= lenb) {
ans[idx++] = csa[a++];
} else if(csa[a] > csb[b]) {
ans[idx++] = csa[a++];
} else if(csa[a] < csb[b]) {
ans[idx++] = csb[b++];
} else {
//
if(look(w1.substring(a), w2.substring(b))) {
// a b
ans[idx++] = csa[a++];
} else {
// b
ans[idx++] = csb[b++];
}
}
}
return new String(ans);
}
public boolean look(String a, String b){
return a.compareTo(b) > 0;
}
}
1755.最も目標値に近いサブシーケンスと
`nums` `goal` 。
`nums` , `goal` 。 , `sum` , ** ** `abs(sum - goal)` 。
`abs(sum - goal)` ** ** 。
, ( ) 。
class Solution {
static int lower_bound(int[] g, int target) {
/**
* g ≥target [l,r)
* */
int l = 0, r = g.length;
//if(target>g[r-1])return r;
while (l + 1 < r) {
int mid = l + (r - 1 - l) / 2;
if (g[mid] < target) {
l = mid + 1;
} else if (g[mid] >= target) {
r = mid + 1;
}
}
return l;
}
public int minAbsDifference(int[] nums, int goal) {
int n = nums.length;
int n1 = (n + 1) / 2, n2 = n - n1;
int[] f1 = new int[(1 << n1)], f2 = new int[(1 << n2)];
for (int i = 0; i < (1 << n1); ++i) {
//
for (int j = 0; j < n1; ++j) {
if (((i >> j) & 1) == 1) {
f1[i] += nums[j];
}
}
}
for (int i = 0; i < (1 << n2); ++i) {
//
for (int j = 0; j < n2; ++j) {
if (((i >> j) & 1) == 1) {
f2[i] += nums[n1 + j];
}
}
}
Arrays.sort(f2);
int ans = Integer.MAX_VALUE;
for (int i = 0; i < f1.length; ++i) {
// f1
int target = goal - f1[i];
int index = lower_bound(f2, target); // f2
if (index < f2.length) {
ans = min(ans, abs(f1[i] + f2[index] - goal));
}
if (index - 1 >= 0) {
ans = min(ans, abs(f1[i] + f2[index - 1] - goal));
}
}
return ans;
}
}
: (LeetCode)
:https://leetcode-cn.com/