国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法leetcode|81. 搜索旋轉(zhuǎn)排序數(shù)組 II(rust重拳出擊)

這篇具有很好參考價值的文章主要介紹了算法leetcode|81. 搜索旋轉(zhuǎn)排序數(shù)組 II(rust重拳出擊)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。



81. 搜索旋轉(zhuǎn)排序數(shù)組 II:

已知存在一個按非降序排列的整數(shù)數(shù)組 nums ,數(shù)組中的值不必互不相同。

在傳遞給函數(shù)之前,nums 在預先未知的某個下標 k0 <= k < nums.length)上進行了 旋轉(zhuǎn) ,使數(shù)組變?yōu)?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標 從 0 開始 計數(shù))。例如, [0,1,2,4,4,4,5,6,6,7] 在下標 5 處經(jīng)旋轉(zhuǎn)后可能變?yōu)?[4,5,6,6,7,0,1,2,4,4] 。

給你 旋轉(zhuǎn)后 的數(shù)組 nums 和一個整數(shù) target ,請你編寫一個函數(shù)來判斷給定的目標值是否存在于數(shù)組中。如果 nums 中存在這個目標值 target ,則返回 true ,否則返回 false

你必須盡可能減少整個操作步驟。

樣例 1:

輸入:
	
	nums = [2,5,6,0,0,1,2], target = 0
	
輸出:
	
	true

樣例 2:

輸入:
	
	nums = [2,5,6,0,0,1,2], target = 3
	
輸出:
	
	false

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • 題目數(shù)據(jù)保證 nums 在預先未知的某個下標上進行了旋轉(zhuǎn)
  • -104 <= target <= 104

進階:

  • 這是 搜索旋轉(zhuǎn)排序數(shù)組 的延伸題目,本題中的 nums 可能包含重復元素。
  • 這會影響到程序的時間復雜度嗎?會有怎樣的影響,為什么?

分析:

  • 面對這道算法題目,二當家的再次陷入了沉思。
  • 如果沒有旋轉(zhuǎn),那肯定使用二分查找,二分查找可以在每一次循環(huán)遍歷都排除一半的數(shù)據(jù),效率非常高。
  • 要使用二分查找,數(shù)組必須是有序的,但是數(shù)組已經(jīng)被旋轉(zhuǎn)了,所以并不是完全有序,但也并不是完全沒有辦法。
  • 一般的二分是每次比較中間元素,然后判斷元素是否相等,如果不相等再看元素應該在左半部分,還是右半部分,由此排除一半的元素,再繼續(xù)在另一部分中重復這樣的邏輯。
  • 我們可以使用變形的二分查找,可以想到,有序數(shù)組旋轉(zhuǎn)后,從中分成兩部分,一定有一部分是有序的,而另一部分也是部分有序,但是頭一定不小于尾,所以我們可以先判斷哪一部分有序,然后再看目標數(shù)字是否在有序那部分當中,來決定改變左邊界,還是右邊界,這樣便可以達到二分查找的效率。
    算法leetcode|81. 搜索旋轉(zhuǎn)排序數(shù)組 II(rust重拳出擊),LeetCode力扣算法題目,rust,golang,算法,數(shù)據(jù)結(jié)構(gòu),后端,leetcode
  • 由于數(shù)組中允許重復元素,那么在某一次查找時,可能會出現(xiàn)中間元素和頭尾元素都是相同的情況,這時候就沒辦法判斷哪半部分是有序的,也就不能直接排除一半的元素,但是我們可以將頭和尾的元素排除掉。

題解:

rust:

impl Solution {
    pub fn search(nums: Vec<i32>, target: i32) -> bool {
        let n = nums.len();
        if n == 0 {
            return false;
        }
        if n == 1 {
            return nums[0] == target;
        }
        let (mut l, mut r) = (0, n - 1);
        while l <= r {
            let mid = (l + r) >> 1;
            if nums[mid] == target {
                return true;
            }
            if nums[l] == nums[mid] && nums[mid] == nums[r] {
                if r == 0 {
                    // 防止r溢出到非常大
                    return false;
                }
                l += 1;
                r -= 1;
            } else if nums[l] <= nums[mid] {
                if nums[l] <= target && target < nums[mid] {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {
                if nums[mid] < target && target <= nums[n - 1] {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return false;
    }
}

go:

func search(nums []int, target int) bool {
    n := len(nums)
	if n == 0 {
		return false
	}
	if n == 1 {
		return nums[0] == target
	}
	l, r := 0, n-1
	for l <= r {
		mid := (l + r) >> 1
		if nums[mid] == target {
			return true
		}
		if nums[l] == nums[mid] && nums[mid] == nums[r] {
			l++
			r--
		} else if nums[l] <= nums[mid] {
			if nums[l] <= target && target < nums[mid] {
				r = mid - 1
			} else {
				l = mid + 1
			}
		} else {
			if nums[mid] < target && target <= nums[n-1] {
				l = mid + 1
			} else {
				r = mid - 1
			}
		}
	}
	return false
}

c++:

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        const int n = nums.size();
        if (n == 0) {
            return false;
        }
        if (n == 1) {
            return nums[0] == target;
        }
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (nums[mid] == target) {
                return true;
            }
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
                ++l;
                --r;
            } else if (nums[l] <= nums[mid]) {
                if (nums[l] <= target && target < nums[mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {
                if (nums[mid] < target && target <= nums[n - 1]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return false;
    }
};

python:

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        if not nums:
            return False

        n = len(nums)
        if n == 1:
            return nums[0] == target

        l, r = 0, n - 1
        while l <= r:
            mid = (l + r) >> 1
            if nums[mid] == target:
                return True
            if nums[l] == nums[mid] and nums[mid] == nums[r]:
                l += 1
                r -= 1
            elif nums[l] <= nums[mid]:
                if nums[l] <= target < nums[mid]:
                    r = mid - 1
                else:
                    l = mid + 1
            else:
                if nums[mid] < target <= nums[n - 1]:
                    l = mid + 1
                else:
                    r = mid - 1

        return False


java:

class Solution {
    public boolean search(int[] nums, int target) {
        final int n = nums.length;
        if (n == 0) {
            return false;
        }
        if (n == 1) {
            return nums[0] == target;
        }
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (nums[mid] == target) {
                return true;
            }
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
                ++l;
                --r;
            } else if (nums[l] <= nums[mid]) {
                if (nums[l] <= target && target < nums[mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {
                if (nums[mid] < target && target <= nums[n - 1]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return false;
    }
}

非常感謝你閱讀本文~
歡迎【點贊】【收藏】【評論】三連走一波~
放棄不難,但堅持一定很酷~
希望我們大家都能每天進步一點點~
本文由 二當家的白帽子:https://le-yi.blog.csdn.net/ 博客原創(chuàng)~文章來源地址http://www.zghlxwxcb.cn/news/detail-726679.html


到了這里,關(guān)于算法leetcode|81. 搜索旋轉(zhuǎn)排序數(shù)組 II(rust重拳出擊)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 算法leetcode|48. 旋轉(zhuǎn)圖像(rust重拳出擊)

    算法leetcode|48. 旋轉(zhuǎn)圖像(rust重拳出擊)

    給定一個 n × n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉(zhuǎn) 90 度。 你必須在 原地 旋轉(zhuǎn)圖像,這意味著你需要直接修改輸入的二維矩陣。 請不要 使用另一個矩陣來旋轉(zhuǎn)圖像。 n == matrix.length == matrix[i].length 1 = n = 20 -1000 = matrix[i][j] = 1000 面對這道算法題目,二當家

    2024年02月01日
    瀏覽(37)
  • 算法leetcode|90. 子集 II(rust重拳出擊)

    給你一個整數(shù)數(shù)組 nums ,其中可能包含重復元素,請你返回該數(shù)組所有可能的子集(冪集)。 解集 不能 包含重復的子集。返回的解集中,子集可以按 任意順序 排列。 1 = nums.length = 10 -10 = nums[i] = 10 面對這道算法題目,二當家的再次陷入了沉思。 窮舉數(shù)組的所有子集,每個

    2024年02月04日
    瀏覽(18)
  • 算法leetcode|61. 旋轉(zhuǎn)鏈表(rust重拳出擊)

    算法leetcode|61. 旋轉(zhuǎn)鏈表(rust重拳出擊)

    給你一個鏈表的頭節(jié)點 head ,旋轉(zhuǎn)鏈表,將鏈表每個節(jié)點向右移動 k 個位置。 鏈表中節(jié)點的數(shù)目在范圍 [0, 500] 內(nèi) -100 = Node.val = 100 0 = k = 2 * 10 9 面對這道算法題目,二當家的再次陷入了沉思。 首先節(jié)點向右移動的位置 k 為0,我們什么都不需要做,直接返回原來的鏈表即可。

    2024年02月13日
    瀏覽(30)
  • 算法leetcode|59. 螺旋矩陣 II(rust重拳出擊)

    算法leetcode|59. 螺旋矩陣 II(rust重拳出擊)

    給你一個正整數(shù) n ,生成一個包含 1 到 n 2 所有元素,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。 1 = n = 20 面對這道算法題目,二當家的再次陷入了沉思。 可以每次循環(huán)移動一步,判斷移到邊界就變換方向,巧用數(shù)組可以減少邏輯判斷的復雜性。 也可以每次循環(huán)

    2024年02月11日
    瀏覽(22)
  • 算法leetcode|45. 跳躍游戲 II(rust重拳出擊)

    算法leetcode|45. 跳躍游戲 II(rust重拳出擊)

    給定一個長度為 n 的 0 索引整數(shù)數(shù)組 nums 。初始位置為 nums[0] 。 每個元素 nums[i] 表示從索引 i 向前跳轉(zhuǎn)的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉(zhuǎn)到任意 nums[i + j] 處: 0 = j = nums[i] i + j n 返回到達 nums[n - 1] 的 最小跳躍次數(shù) 。生成的測試用例可以到達 nums[n - 1] 。

    2023年04月15日
    瀏覽(29)
  • 算法leetcode|63. 不同路徑 II(rust重拳出擊)

    算法leetcode|63. 不同路徑 II(rust重拳出擊)

    一個機器人位于一個 m x n 網(wǎng)格的左上角 (起始點在下圖中標記為 “Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網(wǎng)格的右下角(在下圖中標記為 “Finish”)。 現(xiàn)在考慮網(wǎng)格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑? 網(wǎng)格中的障礙

    2024年02月16日
    瀏覽(27)
  • 算法leetcode|47. 全排列 II(rust重拳出擊)

    給定一個可包含重復數(shù)字的序列 nums , 按任意順序 返回所有不重復的全排列。 1 = nums.length = 8 -10 = nums[i] = 10 面對這道算法題目,二當家的再次陷入了沉思。 要做全排列,就用遞歸套娃大法,回溯是大方向。 有重復的數(shù)字,又要不重復的排列,去重也是必須的了,最慢的方

    2023年04月26日
    瀏覽(25)
  • 算法leetcode|92. 反轉(zhuǎn)鏈表 II(rust重拳出擊)

    算法leetcode|92. 反轉(zhuǎn)鏈表 II(rust重拳出擊)

    給你單鏈表的頭指針 head 和兩個整數(shù) left 和 right ,其中 left = right 。請你反轉(zhuǎn)從位置 left 到位置 right 的鏈表節(jié)點,返回 反轉(zhuǎn)后的鏈表 。 鏈表中節(jié)點數(shù)目為 n 1 = n = 500 -500 = Node.val = 500 1 = left = right = n 你可以使用一趟掃描完成反轉(zhuǎn)嗎? 將鏈表分成3部分,即前面不需要反轉(zhuǎn)的部

    2024年02月05日
    瀏覽(28)
  • 力扣_數(shù)組24—搜索旋轉(zhuǎn)排序數(shù)組II

    已知存在一個按非降序排列的整數(shù)數(shù)組 n u m s nums n u m s ,數(shù)組中的值不必互不相同。 在傳遞給函數(shù)之前, n u m s nums n u m s 在預先未知的某個下標 k ( 0 = k n u m s . l e n g t h ) k(0 = k nums.length) k ( 0 = k n u m s . l e n g t h ) 上進行了 旋轉(zhuǎn) ,使數(shù)組變?yōu)?[ n u m s [ k ] , n u m s [

    2024年01月19日
    瀏覽(20)
  • 算法leetcode|79. 單詞搜索(rust重拳出擊)

    算法leetcode|79. 單詞搜索(rust重拳出擊)

    給定一個 m x n 二維字符網(wǎng)格 board 和一個字符串單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。 單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內(nèi)的字母不允許被重復使用。

    2024年02月09日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包