【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 用户,积累的一些个人经验,尽可能地帮助大家少走弯路。
🚀 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; }};
📢📢 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; }}
📢📢 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
🚀 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;一样 }};
📢📢 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; }}
📢📢 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
🚀 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的长度 }};
📢📢 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; }}
📢📢 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算法大总结,啃下这块硬骨头
https://jeames.blog.csdn.net/article/details/124919920