[{"data":1,"prerenderedAt":521},["ShallowReactive",2],{"post-algorithm-learning-003-binarysearch":3,"home":499},{"id":4,"title":5,"body":6,"date":489,"description":490,"extension":491,"meta":492,"navigation":300,"path":493,"seo":494,"stem":495,"tags":496,"__hash__":498},"blog\u002Fblog\u002Falgorithm-learning-003-binarysearch.md","二分搜索",{"type":7,"value":8,"toc":482},"minimark",[9,13,91,95,179,183,253,256,266,383,386,465,472,475,478],[10,11,12],"h2",{"id":12},"在有序数组中确定num的存在",[14,15,20],"pre",{"className":16,"code":17,"language":18,"meta":19,"style":19},"language-cpp shiki shiki-themes github-light github-dark","bool binary_search(std::vector\u003Cint> &nums, int target) {\n  int l = 0, r = nums.size() - 1;\n  int m = 0;\n  while(l \u003C= r) {\n    m = l + (r - l) \u002F 2;\n    if(nums[m] == target) return true;\n    else if(nums[m] > target ) r = m - 1;\n    else l = m + 1;\n  }\n  return false;\n}\n","cpp","",[21,22,23,31,37,43,49,55,61,67,73,79,85],"code",{"__ignoreMap":19},[24,25,28],"span",{"class":26,"line":27},"line",1,[24,29,30],{},"bool binary_search(std::vector\u003Cint> &nums, int target) {\n",[24,32,34],{"class":26,"line":33},2,[24,35,36],{},"  int l = 0, r = nums.size() - 1;\n",[24,38,40],{"class":26,"line":39},3,[24,41,42],{},"  int m = 0;\n",[24,44,46],{"class":26,"line":45},4,[24,47,48],{},"  while(l \u003C= r) {\n",[24,50,52],{"class":26,"line":51},5,[24,53,54],{},"    m = l + (r - l) \u002F 2;\n",[24,56,58],{"class":26,"line":57},6,[24,59,60],{},"    if(nums[m] == target) return true;\n",[24,62,64],{"class":26,"line":63},7,[24,65,66],{},"    else if(nums[m] > target ) r = m - 1;\n",[24,68,70],{"class":26,"line":69},8,[24,71,72],{},"    else l = m + 1;\n",[24,74,76],{"class":26,"line":75},9,[24,77,78],{},"  }\n",[24,80,82],{"class":26,"line":81},10,[24,83,84],{},"  return false;\n",[24,86,88],{"class":26,"line":87},11,[24,89,90],{},"}\n",[10,92,94],{"id":93},"在有序数组中找num的最左位置","在有序数组中找>=num的最左位置",[14,96,98],{"className":16,"code":97,"language":18,"meta":19,"style":19},"int binary_search(std::vector\u003Cint> &nums, int target) {\n  int l = 0, r = nums.size() - 1;\n  int m = 0;\n  int index = -1;\n  while(l \u003C= r) {\n    m = 1 + (r - l) \u002F 2;\n    if(nums[m] >= target) {\n      index = m;\n      r = m - 1;\n    }\n    else {\n      l = m + 1;\n    }\n  }\n  return index;\n}\n",[21,99,100,105,109,113,118,122,127,132,137,142,147,152,158,163,168,174],{"__ignoreMap":19},[24,101,102],{"class":26,"line":27},[24,103,104],{},"int binary_search(std::vector\u003Cint> &nums, int target) {\n",[24,106,107],{"class":26,"line":33},[24,108,36],{},[24,110,111],{"class":26,"line":39},[24,112,42],{},[24,114,115],{"class":26,"line":45},[24,116,117],{},"  int index = -1;\n",[24,119,120],{"class":26,"line":51},[24,121,48],{},[24,123,124],{"class":26,"line":57},[24,125,126],{},"    m = 1 + (r - l) \u002F 2;\n",[24,128,129],{"class":26,"line":63},[24,130,131],{},"    if(nums[m] >= target) {\n",[24,133,134],{"class":26,"line":69},[24,135,136],{},"      index = m;\n",[24,138,139],{"class":26,"line":75},[24,140,141],{},"      r = m - 1;\n",[24,143,144],{"class":26,"line":81},[24,145,146],{},"    }\n",[24,148,149],{"class":26,"line":87},[24,150,151],{},"    else {\n",[24,153,155],{"class":26,"line":154},12,[24,156,157],{},"      l = m + 1;\n",[24,159,161],{"class":26,"line":160},13,[24,162,146],{},[24,164,166],{"class":26,"line":165},14,[24,167,78],{},[24,169,171],{"class":26,"line":170},15,[24,172,173],{},"  return index;\n",[24,175,177],{"class":26,"line":176},16,[24,178,90],{},[10,180,182],{"id":181},"在有序数组中找num的最右位置","在有序数组中找\u003C=num的最右位置",[14,184,186],{"className":16,"code":185,"language":18,"meta":19,"style":19},"int binary_search(std::vector\u003Cint> &nums, int target) {\n  int l = 0, r = nums.size() - 1;\n  int m = 0;\n  int index = -1;\n  while(l \u003C= r) {\n    m = 1 + (r - l) \u002F 2;\n    if(nums[m] \u003C= target) {\n      index = m;\n      l = m + 1;\n    }\n    else {\n      r = m - 1;\n    }\n  }\n  return index;\n}\n",[21,187,188,192,196,200,204,208,212,217,221,225,229,233,237,241,245,249],{"__ignoreMap":19},[24,189,190],{"class":26,"line":27},[24,191,104],{},[24,193,194],{"class":26,"line":33},[24,195,36],{},[24,197,198],{"class":26,"line":39},[24,199,42],{},[24,201,202],{"class":26,"line":45},[24,203,117],{},[24,205,206],{"class":26,"line":51},[24,207,48],{},[24,209,210],{"class":26,"line":57},[24,211,126],{},[24,213,214],{"class":26,"line":63},[24,215,216],{},"    if(nums[m] \u003C= target) {\n",[24,218,219],{"class":26,"line":69},[24,220,136],{},[24,222,223],{"class":26,"line":75},[24,224,157],{},[24,226,227],{"class":26,"line":81},[24,228,146],{},[24,230,231],{"class":26,"line":87},[24,232,151],{},[24,234,235],{"class":26,"line":154},[24,236,141],{},[24,238,239],{"class":26,"line":160},[24,240,146],{},[24,242,243],{"class":26,"line":165},[24,244,78],{},[24,246,247],{"class":26,"line":170},[24,248,173],{},[24,250,251],{"class":26,"line":176},[24,252,90],{},[10,254,255],{"id":255},"二分搜索不一定在有序数组上",[257,258,259],"p",{},[260,261,265],"a",{"href":262,"rel":263},"https:\u002F\u002Fleetcode.cn\u002Fproblems\u002Ffind-peak-element\u002Fdescription\u002F",[264],"nofollow","leetcode 162.寻找峰值",[14,267,269],{"className":16,"code":268,"language":18,"meta":19,"style":19},"int find_peak(std::vector\u003Cint> &nums) {\n  int n = nums.size();\n  if(n == 1) return 0;\n  if(nums[0] > nums[1]) return 0;\n  if(nums[n-1] > nums[n-2]) return n-1;\n\n  int l = 1, r = n - 2, m = 0, ans = -1;\n  while(l \u003C= r) {\n    m = l + (r - l) \u002F 2;\n    \u002F\u002F 小于左边的数，那么极值点一定在左边\n    \u002F\u002F 右边可能也有但只要求返回一个极值点，不管右边\n    if(nums[m] \u003C nums[m-1]) r = m - 1;\n    \u002F\u002F 大于左边的数，小于右边的数，极值点一定在右边\n    else if(nums[m] \u003C nums[m+1]) l = m + 1;\n    \u002F\u002F 大于左边又大于右边，返回极值点\n    else{\n      ans = m;\n      break;\n    }\n  }\n  return ans;\n}\n",[21,270,271,276,281,286,291,296,302,307,311,315,320,325,330,335,340,345,350,356,362,367,372,378],{"__ignoreMap":19},[24,272,273],{"class":26,"line":27},[24,274,275],{},"int find_peak(std::vector\u003Cint> &nums) {\n",[24,277,278],{"class":26,"line":33},[24,279,280],{},"  int n = nums.size();\n",[24,282,283],{"class":26,"line":39},[24,284,285],{},"  if(n == 1) return 0;\n",[24,287,288],{"class":26,"line":45},[24,289,290],{},"  if(nums[0] > nums[1]) return 0;\n",[24,292,293],{"class":26,"line":51},[24,294,295],{},"  if(nums[n-1] > nums[n-2]) return n-1;\n",[24,297,298],{"class":26,"line":57},[24,299,301],{"emptyLinePlaceholder":300},true,"\n",[24,303,304],{"class":26,"line":63},[24,305,306],{},"  int l = 1, r = n - 2, m = 0, ans = -1;\n",[24,308,309],{"class":26,"line":69},[24,310,48],{},[24,312,313],{"class":26,"line":75},[24,314,54],{},[24,316,317],{"class":26,"line":81},[24,318,319],{},"    \u002F\u002F 小于左边的数，那么极值点一定在左边\n",[24,321,322],{"class":26,"line":87},[24,323,324],{},"    \u002F\u002F 右边可能也有但只要求返回一个极值点，不管右边\n",[24,326,327],{"class":26,"line":154},[24,328,329],{},"    if(nums[m] \u003C nums[m-1]) r = m - 1;\n",[24,331,332],{"class":26,"line":160},[24,333,334],{},"    \u002F\u002F 大于左边的数，小于右边的数，极值点一定在右边\n",[24,336,337],{"class":26,"line":165},[24,338,339],{},"    else if(nums[m] \u003C nums[m+1]) l = m + 1;\n",[24,341,342],{"class":26,"line":170},[24,343,344],{},"    \u002F\u002F 大于左边又大于右边，返回极值点\n",[24,346,347],{"class":26,"line":176},[24,348,349],{},"    else{\n",[24,351,353],{"class":26,"line":352},17,[24,354,355],{},"      ans = m;\n",[24,357,359],{"class":26,"line":358},18,[24,360,361],{},"      break;\n",[24,363,365],{"class":26,"line":364},19,[24,366,146],{},[24,368,370],{"class":26,"line":369},20,[24,371,78],{},[24,373,375],{"class":26,"line":374},21,[24,376,377],{},"  return ans;\n",[24,379,381],{"class":26,"line":380},22,[24,382,90],{},[257,384,385],{},"另一种if判断",[14,387,389],{"className":16,"code":388,"language":18,"meta":19,"style":19},"int find_peak(std::vector\u003Cint> &nums) {\n  int n = nums.size();\n  if(n == 1) return 0;\n  if(nums[0] > nums[1]) return 0;\n  if(nums[n-1] > nums[n-2]) return n-1;\n\n  int l = 1, r = n - 2, m = 0, ans = -1;\n  while(l \u003C= r) {\n    m = l + (r - l) \u002F 2;\n    if(nums[m] > nums[m-1] && nums[m] > nums[m+1]){\n      ans = m;\n      break;\n    }\n    else if(nums[m] \u003C nums[m-1]) r = m - 1;\n    else l = m + 1;\n  }\n  return ans;\n}\n",[21,390,391,395,399,403,407,411,415,419,423,427,432,436,440,444,449,453,457,461],{"__ignoreMap":19},[24,392,393],{"class":26,"line":27},[24,394,275],{},[24,396,397],{"class":26,"line":33},[24,398,280],{},[24,400,401],{"class":26,"line":39},[24,402,285],{},[24,404,405],{"class":26,"line":45},[24,406,290],{},[24,408,409],{"class":26,"line":51},[24,410,295],{},[24,412,413],{"class":26,"line":57},[24,414,301],{"emptyLinePlaceholder":300},[24,416,417],{"class":26,"line":63},[24,418,306],{},[24,420,421],{"class":26,"line":69},[24,422,48],{},[24,424,425],{"class":26,"line":75},[24,426,54],{},[24,428,429],{"class":26,"line":81},[24,430,431],{},"    if(nums[m] > nums[m-1] && nums[m] > nums[m+1]){\n",[24,433,434],{"class":26,"line":87},[24,435,355],{},[24,437,438],{"class":26,"line":154},[24,439,361],{},[24,441,442],{"class":26,"line":160},[24,443,146],{},[24,445,446],{"class":26,"line":165},[24,447,448],{},"    else if(nums[m] \u003C nums[m-1]) r = m - 1;\n",[24,450,451],{"class":26,"line":170},[24,452,72],{},[24,454,455],{"class":26,"line":176},[24,456,78],{},[24,458,459],{"class":26,"line":352},[24,460,377],{},[24,462,463],{"class":26,"line":358},[24,464,90],{},[257,466,467,468,471],{},"注意初始l，r的值，如果",[21,469,470],{},"int l = 0, r = n - 1","，当m为0或者n-1时，m-1或m+1会越界",[10,473,474],{"id":474},"二分答案法",[257,476,477],{},"待续...",[479,480,481],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":19,"searchDepth":33,"depth":33,"links":483},[484,485,486,487,488],{"id":12,"depth":33,"text":12},{"id":93,"depth":33,"text":94},{"id":181,"depth":33,"text":182},{"id":255,"depth":33,"text":255},{"id":474,"depth":33,"text":474},"2025-11-27","笔记","md",{},"\u002Fblog\u002Falgorithm-learning-003-binarysearch",{"title":5,"description":490},"blog\u002Falgorithm-learning-003-binarysearch",[497],"算法","clwtVRZgjl2NkybguK28mv2cdlBhgwyRHyvlg4NAKGQ",{"id":500,"title":501,"avatar":502,"body":503,"description":507,"extension":491,"meta":508,"name":510,"navigation":300,"path":511,"seo":512,"social":513,"stem":519,"__hash__":520},"home\u002Fhome.md","Home","https:\u002F\u002Fstarrobe-blog.oss-cn-beijing.aliyuncs.com\u002Favatar\u002Fjashinchan.jpg",{"type":7,"value":504,"toc":505},[],{"title":19,"searchDepth":33,"depth":33,"links":506},[],"Programming enthusiast, maybe.",{"layout":509},"page","阿东","\u002Fhome",{"title":501,"description":507},{"github":514,"email":515,"bilibili":516,"qq":517,"rss":518},"https:\u002F\u002Fgithub.com\u002Fstarrobe","mailto:starrobe@163.com","https:\u002F\u002Fspace.bilibili.com\u002F382631863","tencent:\u002F\u002Fmessage\u002F?uin=2604335528","\u002Ffeed.xml","home","XHOrpn2fXb8x87SMsqZTGaANCESyH9qV8TDm8rnQewI",1777128585656]