【推奨アルゴリズム問題演習】day7


1. 35. 挿入位置の検索

1. トピックの紹介

35. 挿入位置の検索 ソート
された配列とターゲット値を指定して、配列内でターゲット値を見つけてそのインデックスを返します。ターゲット値が配列内に存在しない場合は、その値が順番に挿入される位置を返します。
時間計算量が O(log n) のアルゴリズムを使用してください。
ここに画像の説明を挿入します

2. 問題解決のアイデア

3.コード

class Solution {
    
    
public:
    int searchInsert(vector<int>& nums, int target) {
    
    
        int left = 0, right = nums.size() - 1;
        while(left <= right)
        {
    
    
            int mid = left + (right - left) / 2;
            if(nums[mid] < target)
            {
    
    
                left = mid + 1;
            }
            else if(nums[mid] > target)
            {
    
    
                right = mid - 1;
            }
            else
            {
    
    
                return mid;
            }
        }
        return left;
    }
};

4. 走行結果

ここに画像の説明を挿入します

2. 69. x の平方根

1. トピックの紹介

69. x の平方根
負でない整数 x を指定して、x の算術平方根を計算して返します。
戻り値の型が整数であるため、結果の整数部分のみが保持され、小数部分は四捨五入されます。
注: pow(x, 0.5) や x ** 0.5 などの組み込みの指数関数および演算子は使用できません。
ここに画像の説明を挿入します

2. 問題解決のアイデア

3.コード

class Solution {
    
    
public:
    int mySqrt(int x) {
    
    
        if(x < 1) return 0;
        int left = 1, right = x;
        while(left < right)
        {
    
    
            long long mid = left + (right - left + 1) / 2;
            if(mid * mid <= x)
            {
    
    
                left = mid;
            }
            else
            {
    
    
                right = mid - 1;
            }
        }
        return left;
    }
};

4. 走行結果

ここに画像の説明を挿入します

3. 852. 山配列のピークインデックス

1. トピックの紹介

852. マウンテン配列のピークインデックス
次のプロパティを満たす配列 arr はマウンテン配列と呼ばれます:
arr.length >= 3
が存在し、次のような i (0 < i < arr.length - 1):
arr[0] < arr[ 1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1] は、
整数で構成される山配列 arr を与え、arr を返します。 [0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] の添字 i。
時間計算量 O(log(n)) のソリューションを設計して実装する必要があります。
ここに画像の説明を挿入します

2. 問題解決のアイデア

3.コード

class Solution {
    
    
public:
    int peakIndexInMountainArray(vector<int>& arr) {
    
    
        int left = 1, right = arr.size() - 2;
        while(left < right)
        {
    
    
            int mid = left + (right - left + 1) / 2;
            if(arr[mid] > arr[mid - 1])//如果mid所处位置是上升的,则我们要在mid + 1~right区间寻找
            {
    
    
                left = mid;
            }
            else//如果mid所处位置是下降的,则我们要在left~mid-1区间寻找
            {
    
    
                right = mid - 1;
            }
        }
        return left;
    }
};

4. 走行結果

ここに画像の説明を挿入します


要約する

今日はアルゴリズム実習7日目です。
頑張って鉄杵を針状に磨く限り、頑張り続けてください!
質問元: LeetCode、著作権は LeetCode に属します。
この記事があなたにインスピレーションを与えたなら、著者をもっとサポートしていただければ幸いです。皆さん、ありがとう!

おすすめ

転載: blog.csdn.net/xjjxjy_2021/article/details/131745729