> 文档中心 > 【LeetCode-算法入门】第1天:二分查找

【LeetCode-算法入门】第1天:二分查找


📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

  • 前言
    • 🚀 704. 二分查找
      • 🌈 1. 题目
      • 🌈 2. 答案
    • 🚀 278. 第一个错误的版本
      • 🌈 1. 题目
      • 🌈 2. 答案
    • 🚀 35. 搜索插入位置
      • 🌈 1. 题目
      • 🌈 2. 答案

前言

算法是程序员的内功,掌握算法不仅能帮助你在面试中过关斩将,赢取 Dream Offer,更能充分锻炼你的逻辑思维与底层能力,我是一名忠实的 Leetcode 用户,积累的一些个人经验,尽可能地帮助大家少走弯路。


【LeetCode-算法入门】第1天:二分查找

🚀 704. 二分查找

🌈 1. 题目

难度系数:🚩🚀 题目给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1提示:你可以假设 nums 中的所有元素是不重复的。n 将在 [1, 10000]之间。nums 的每个元素都将在 [-9999, 9999]之间。

🌈 2. 答案

📢📢 C++

class Solution {public:    int search(vector<int>& nums, int target) { int left = 0; int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right) while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <     int middle = left + ((right - left) >> 1);     if (nums[middle] > target) {  right = middle; // target 在左区间,在[left, middle)中     } else if (nums[middle] < target) {  left = middle + 1; // target 在右区间,在[middle + 1, right)中     } else { // nums[middle] == target  return middle; // 数组中找到目标值,直接返回下标     } } // 未找到目标值 return -1;    }};

【LeetCode-算法入门】第1天:二分查找
📢📢 Java

class Solution {    public int search(int[] nums, int target) { int left = 0, right = nums.length; while (left < right) {     int mid = left + ((right - left) >> 1);     if (nums[mid] == target)  return mid;     else if (nums[mid] < target)  left = mid + 1;     else if (nums[mid] > target)  right = mid; } return -1;    }}

【LeetCode-算法入门】第1天:二分查找
📢📢 Python

class Solution:    def search(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1  while left <= right:     middle = (left + right) // 2     if nums[middle] < target:  left = middle + 1     elif nums[middle] > target:  right = middle - 1     else:  return middle return -1

【LeetCode-算法入门】第1天:二分查找

🚀 278. 第一个错误的版本

🌈 1. 题目

难度系数:🚩🚀 题目你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例 1:输入:n = 5, bad = 4输出:4解释:调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true所以,4 是第一个错误的版本。示例 2:输入:n = 1, bad = 1输出:1提示:1 <= bad <= n <= 231 - 1

🌈 2. 答案

📢📢 C++

// The API isBadVersion is defined for you.// bool isBadVersion(int version);class Solution {public:    int firstBadVersion(int n) { int left = 1; int right = n; while (left < right) {     int mid = (right-left)/2 + left;     // 只考虑一段,另一端不断缩进     /* 理解:  若mid是true  则有可能mid就是第一个true,因此不能偏移  false的话必然需要偏移才能到达true的状态     */     if (isBadVersion(mid)) {  right = mid;     } else {  left = mid + 1;     } } // 退出循环时必然是 left == right return left; // return right;一样    }};

【LeetCode-算法入门】第1天:二分查找
📢📢 Java

/* The isBadVersion API is defined in the parent class VersionControl.      boolean isBadVersion(int version); */public class Solution extends VersionControl {    public int firstBadVersion(int n) { if (n < 1) {     return -1; } int left = 1; int right = n; int result = -1; while (left <= right) {     int mid = left + ((right - left) >> 1);     if (isBadVersion(mid)) {  right = mid - 1;  result = mid;     } else {  left = mid + 1;     } } return result;    }}

【LeetCode-算法入门】第1天:二分查找
📢📢 Python

# The isBadVersion API is already defined for you.# @param version, an integer# @return an integer# def isBadVersion(version):class Solution:    def firstBadVersion(self, n): """ :type n: int :rtype: int """ # 二分查找的变种题 begin_version, end_version = 1, n is_find = False result = 1 while(not is_find):     middle = int((begin_version + end_version) / 2)     if middle == begin_version:      is_find = True      result = middle + 1 if isBadVersion(middle):  if not isBadVersion(middle - 1):      is_find = True      result = middle  else:      end_version = middle     else:  begin_version = middle return result

【LeetCode-算法入门】第1天:二分查找

🚀 35. 搜索插入位置

🌈 1. 题目

难度系数:🚩🚀 题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例 2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3,5,6], target = 7输出: 4提示:1 <= nums.length <= 104-104 <= nums[i] <= 104nums 为 无重复元素 的 升序 排列数组-104 <= target <= 104

🌈 2. 答案

📢📢 C++

class Solution {public:    int searchInsert(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); i++) { // 分别处理如下三种情况 // 目标值在数组所有元素之前 // 目标值等于数组中某一个元素 // 目标值插入数组中的位置     if (nums[i] >= target) { // 一旦发现大于或者等于target的num[i],那么i就是我们要的结果  return i;     } } // 目标值在数组所有元素之后的情况 return nums.size(); // 如果target是最大的,或者 nums为空,则返回nums的长度    }};

【LeetCode-算法入门】第1天:二分查找
📢📢 Java

class Solution {    public int searchInsert(int[] nums, int target) { int n = nums.length; // 定义target在左闭右闭的区间,[low, high] int low = 0; int high = n - 1; while (low <= high) { // 当low==high,区间[low, high]依然有效     int mid = low + (high - low) / 2; // 防止溢出     if (nums[mid] > target) {  high = mid - 1; // target 在左区间,所以[low, mid - 1]     } else if (nums[mid] < target) {  low = mid + 1; // target 在右区间,所以[mid + 1, high]     } else {  // 1. 目标值等于数组中某一个元素  return mid;  return mid;     } } // 2.目标值在数组所有元素之前 3.目标值插入数组中 4.目标值在数组所有元素之后 return right + 1; return high + 1;    }}

【LeetCode-算法入门】第1天:二分查找
📢📢 Python

class Solution:    def searchInsert(self, nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 while left <= right:     middle = (left + right) // 2     if nums[middle] < target:  left = middle + 1     elif nums[middle] > target:  right = middle - 1     else:  return middle return right + 1

【LeetCode-算法入门】第1天:二分查找

备战秋招,LeetCode算法大总结,啃下这块硬骨头
https://jeames.blog.csdn.net/article/details/124919920