【絶対にやっておきたいインタビュー101選】二分探索~二次元配列での探索~

目次

トピック: バイナリ検索 - I_Niuke の質問 Ba_Niuke.com (nowcoder.com)

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

トピック: 2 次元配列での検索_Niuke トピック_Niuke.com (nowcoder.com)

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

最後に次のように書きます。


トピック:バイナリ検索 - I_Niuke の質問 Ba_Niuke.com (nowcoder.com)

質問インターフェイス:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param target int整型 
 * @return int整型
*/
func search( nums []int ,  target int ) int {
    // write code here
}

問題解決のアイデア:

これは最も基本的な二分探索アルゴリズムです。通常の昇順配列に二分探索を記述することです。非常に簡単です。二分探索を直接実行するだけです。これが私のバイナリ テンプレートです:

        while (left <= right) {             int mid = left + (right - left) / 2;

            if ( ... ) left = mid + 1;

            else if ( ... ) right = mid - 1;

            else if ( ... ) はmidを返します。

        }

(これは、C++ を書いていたときにまとめたバイナリ テンプレートです。実際、アルゴリズムはすべて同じです)

コード:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param target int整型 
 * @return int整型
*/
func search( nums []int ,  target int ) int {
    left, right := 0, len(nums)-1
    for left <= right {
        mid := left + (right - left) / 2
        if nums[mid] > target {
            right = mid - 1
        } else if nums[mid] < target {
            left = mid + 1
        } else {
            return mid
        }
    }
    return -1
}

合格した!

トピック: 2 次元配列での検索_Niuke トピック_Niuke.com (nowcoder.com)

質問インターフェイス:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param target int整型 
 * @param array int整型二维数组 
 * @return bool布尔型
*/
func Find( target int ,  array [][]int ) bool {
    // write code here
}

問題解決のアイデア:

この質問は非常に古典的ですが、標準的な二分探索の質問ではありません (なぜ Niuke がそれを二分探索のトピックに含めたのかわかりません)。理論的には二分探索を使用することは可能ですが、必須ではありません。使用するのは複雑ですが、次数はまだ O(N) なので必要ありません。

この古典的な質問には非常に古典的な解決策があります。私は右上隅から検索することに慣れています。それが大きい場合は左に進み、小さい場合は下に進みます。(この質問は実際には Offer の古典的な質問です)

コード:

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param target int整型 
 * @param array int整型二维数组 
 * @return bool布尔型
*/
func Find( target int ,  array [][]int ) bool {
    i, j := len(array)-1, 0
    for i >= 0 && j < len(array[0]) {
        if array[i][j] > target {
            i--
        } else if array[i][j] < target {
            j++
        } else {
            return true
        }
    }
    return false
}

合格した!

最後に次のように書きます。

以上がこの記事の内容です、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/133166376