392. サブシーケンスを決定する
質問の意味:
文字列 s と tが与えられた場合 、 s がt の部分列である かどうかを 判断します。
文字列のサブシーケンスは、残りの文字の相対位置を変更せずに、元の文字列から一部の文字を削除する (または削除しない) ことによって形成される新しい文字列です。(例: はのサブシーケンス
"ace"
ですが、 ではありません)。"abcde"
"aec"
【入力サンプル】
s="abc"、t="ahbgdc"
[出力サンプル] true
問題解決のアイデア:
ダブルポインタの列挙
class Solution {
public boolean isSubsequence(String s, String t) {
//双指针
int i=0,j=0;
while(i < s.length() && j < t.length()){
if(s.charAt(i) == t.charAt(j)){
//相等了,指针往后
++i;
++j;
}else{
//相等的情况下只移动j
++j;
}
}
if(i == s.length()){
return true;
}else{
return false;
}
}
}
タイム: 88.73% を達成
メモリ: 86.35% で負けました
167.2つの数値の和Ⅱ-入力順序配列
質問の意味:
添字が1から 始まる 整数の配列が与えられます 。
numbers
配列は 降順に並べられていますtarget
。配列から 2 つの数値の合計が目的の数値と等しくなるように 見つけてください。これら 2 つの数値をそれぞれnumbers[index1]
合計 するとnumbers[index2]
、 になります1 <= index1 < index2 <= numbers.length
。
[index1, index2]
これら 2 つの整数の添字付き合計を 長さ 2 の整数配列 としてindex1
返します。index2
各入力は一意の回答に対応すると想定でき 、 同じ要素を再利用することはできません。
設計するソリューションでは、一定量の追加スペースのみを使用する必要があります
【入力サンプル】
数値=[2,7,11,15]、ターゲット=9
[出力サンプル][1,2]
問題解決のアイデア:
ダブル ポインターの列挙。1 つは前から開始して後ろに進み (i)、もう 1 つは後から開始して前に進みます (j)。
質問は、それが一意の回答に対応し、i<j であることを示しています。
numbers[i]+numbers[j]>target の場合、numbers[i] の方が小さい値なので、大きすぎる場合は大きい方の値を減らす必要があります (--j)。目標より小さい場合は、小さい値を大きくします。
添字は 1 から始まるので、ans 配列に割り当てるときは添字を +1 にする必要があることに注意してください。
class Solution {
public int[] twoSum(int[] numbers, int target) {
//下标从1开始噢
//双指针i,j 如果i+j小于target,增加i
//如果i+j大于target,减少j
int[] ans= new int[2];
int i=0,j=numbers.length - 1;
while(i<j){
//不会相等,所以i<j
if(numbers[i] + numbers[j] == target){
ans[0] = i+1;
ans[1] = j+1;
return ans;
}
if(numbers[i] + numbers[j] < target){
++i;
}
if(numbers[i] + numbers[j] > target){
--j;
}
}
return ans;
}
}
タイム: 98.30% を達成
メモリ: 75.64% 上回る