剣のオファーの5日目の検索アルゴリズム(剣はオファー04、剣はオファー11、剣はオファー50)

剣はオファー04を指します。2次元配列で検索

トピックの説明

n * m 2D配列では、各行は左から右に昇順で並べ替えられ、各列は上から下に昇順で並べ替えられます。効率的な関数を完成させ、そのような2次元配列と整数を入力し、配列に整数が含まれているかどうかを判別してください。

既存のマトリックスは次のとおりです:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

target = 5の場合、trueを返します。
ターゲット=20の場合、falseを返します。

制限

0 <= n <= 1000
0 <= m <= 1000

アイデア

方法1:暴力。2次元配列の順序特性を考慮しない場合は、2次元配列全体の各要素を直接トラバースして、ターゲット値が2次元配列に存在するかどうかを判断します。
方法2:線形探索。目標値は右上隅から始まります。現在の要素が目標値よりも大きい場合は、現在の要素より下のすべての要素が目標値よりも大きい必要があることを意味します。したがって、検索して目標値を見つけることはできません。下に移動すると、左を検索して目標値を見つけることができます。現在の要素が目標値よりも小さい場合、現在の要素の左側にあるすべての要素が目標値よりも小さくなければならないことを意味するため、左側を検索しても目標値を見つけることはできず、可能です。下を検索してターゲット値を見つけます。

コード

c++コード

class Solution {
    
    
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
    
    
        if(matrix.size()==0){
    
    
            return false;
        }
        int rows = matrix.size(),columns = matrix[0].size();
        int row = 0,column = columns - 1;
        //printf("%d %d\n",rows,columns);
        while(row<rows&&column>=0){
    
    
            int t = matrix[row][column];
            if(t==target){
    
    
                return true;
            }else if(t<target){
    
    
                row++;
            }else{
    
    
                column--;
            }
           // printf("%d %d\n",row,column);
        }
        return false;
    }
};

Pythonコード

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        n = len(matrix)
        if n :
            m = len(matrix[0])
        for i in range(n):
            for j in range(m):
                if matrix[i][j] == target :
                    return True
        return False

11.アレイの最小数を回転させます

トピックの説明

配列の最初の要素を配列の最後に移動することを、配列の回転と呼びます。

要素値が重複している可能性のある配列番号を指定すると、上記のように1回ローテーションされた、昇順の配列であることがわかります。回転した配列の最小要素を返してください。たとえば、配列[3,4,5,1,2]は[1,2,3,4,5]の1回転であり、配列の最小値は1です。

例1

入力:[3,4,5,1,2]
出力:1

例2

入力:[2,2,2,0,1]
出力:0

アイデア

方法1:暴力
方法2:二分法を使用します。lとrの値更新ルールを変更する必要があるだけです。

コード

c++コード

class Solution {
    
    
public:
    int minArray(vector<int>& numbers) {
    
    
            int n = numbers.size();
            int m = 0;
            for(int i=0;i<n;i++){
    
    
                if(!i){
    
    
                    m = numbers[i];
                }else{
    
    
                    if(m>numbers[i]){
    
    
                        m = numbers[i];
                    }
                }
            }
            return m;
    }
};

Pythonコード

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        n = len(numbers)
        l = 0
        r = n-1
        while l<=r :
            mid = (l+r)>>1
            if numbers[mid]>numbers[r] :
                l = mid + 1
            elif numbers[mid]==numbers[r] :
                r-=1
            else:
                r = mid 
        return numbers[l]

剣はオファー50を指します。一度だけ現れる最初のキャラクター

トピックの説明

文字列sで1回だけ出現する最初の文字を検索します。そうでない場合は、単一のスペースを返します。sには小文字のみが含まれます。

例1

入力:s = "abaccdeff"
出力:'b'

例2

入力:s = ""
出力:''

制限

0<=秒の長さ<=50000

アイデアとアルゴリズム

文字列を2回トラバースできます。

最初のパスでは、ハッシュマップを使用して、文字列内の各文字の出現回数をカウントします。2番目のトラバーサルでは、1回だけ表示される文字にトラバースする限り、その文字を返します。それ以外の場合は、トラバーサルの後にスペースを返します。

コード

c++コード

class Solution {
    
    
public:
    char firstUniqChar(string s) {
    
    
        int n = s.length();
        int vis[50010]={
    
    0};
        for(int i=0;i<n;i++){
    
    
            vis[s[i]]++;
        }
        for(int i=0;i<n;i++){
    
    
            if(vis[s[i]]==1){
    
    
                return s[i];
            }
        }
        return ' ';
    }
};

Pythonコード

class Solution:
    def firstUniqChar(self, s: str) -> str:
        f = collections.Counter(s)
        for i, ch in enumerate(s):
            if f[ch] == 1:
                return ch
        return ' '

この記事が私の友達に役立つなら、私はいいねとサポートをしたいと思います〜ありがとうございました〜

ここに画像の説明を挿入


おすすめ

転載: blog.csdn.net/weixin_46627433/article/details/122928531