[LeetCode-150 古典的な面接の質問 - 7 日目]

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% 上回る

 

おすすめ

転載: blog.csdn.net/qq_37998848/article/details/132350719