[トップ 101 の必見インタビュー] 配列内のピークと逆順ペアを見つける

目次

トピック: Peaks を探しています_Nike トピック_Nike ネットワーク (nowcoder.com)

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

トピック: Arrays_Niuke の逆順序ペア Topic_Niuke.com (nowcoder.com)

質問インターフェイス:

問題解決のアイデア:

コード:

合格した!

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


トピック: Peaks を探しています_Nike トピック_Nike ネットワーク (nowcoder.com)

質問インターフェイス:

package main

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

問題解決のアイデア:

まず最初に付け加えておきたいのは、この質問のセルフテストに問題がある場合は信じず、ロジックが正しい場合に提出してください。

この質問は、非常に古典的な二等分問題でもあります。二等分では、二等分を使用するために順序付けられた配列は必要ありません。二分二分の本質は、データの単調性にあります。二等分は、データの単調性と検出を通じて問題の一部をすばやく除去することです。参照オブジェクト、データ、

この質問を例にとると、この質問では、どの山の頂上が返されても、考慮すべき状況は 2 つだけであることが求められます。1 つは山の左側 (間隔が増加) で、もう 1 つは山の右側です。 (減少区間) 増加区間であれば左側のデータを除外でき、減少区間であれば右側のデータも合わせて除外できます。二分法が使用されており、コードは次のとおりです

コード:

package main

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

合格した!

トピック: Arrays_Niuke の逆順序ペア Topic_Niuke.com (nowcoder.com)

質問インターフェイス:

package main

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

問題解決のアイデア:

この問題を総当たりで解くと、基本的な時間計算量は確実に O(N) になります。N*logN を達成したい場合は、他の解法を考えなければなりません。この問題は非常に古典的な問題でもあります。マージソートの書き方を調べる

マージソートのアイデアを使用すると、マージソートを使用するプロセスで質問の要件を完了できます。コードは次のとおりです。

コード:

package main

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

	count := 0
    var mergeSort func(left, right int)
    var merge func(left, right, mid int)

	mergeSort = func(left, right int) {
		if left >= right {
			return
		}

		mid := left + (right-left)/2
		mergeSort(left, mid)
		mergeSort(mid+1, right)
		merge(left, right, mid)
	}

	merge = func(left, right, mid int) {
		l, r := left, mid+1
		res := make([]int, right-left+1)
		index := 0
		for l <= mid && r <= right {
			if nums[l] <= nums[r] {
				res[index] = nums[l]
				l++
				index++
			} else {
				res[index] = nums[r]
				r++
				index++

				count += mid + 1 - l
				count %= 1000000007
			}
		}

		for l <= mid {
			res[index] = nums[l]
			index++
			l++
		}
		for r <= right {
			res[index] = nums[r]
			index++
			r++
		} 
		l = left
		for _, v := range res {
			nums[l] = v
			l++
		}
	}

	mergeSort(0, len(nums)-1)
	return count
}

合格した!

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

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

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

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

おすすめ

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