【leetcode】数组篇刷题 --二分查找
* * @lc app=leetcode.cn id=704 lang=cpp * * [704] 二分查找 */ // @lc code=start class Solution { public: int search(vector<int>& nums, int target) { int lp = 0; int rp = nums.size()-1; int middle; while(lp <= rp) { middle = lp + (rp - lp) / 2; if(target > nums[middle]) { lp = middle + 1; }else if(target < nums[middle]){ rp = middle - 1; }else if(target == nums[middle]){ return middle; } } return -1; } };
/* * @lc app=leetcode.cn id=34 lang=cpp * * [34] 在排序数组中查找元素的第一个和最后一个位置 */ // @lc code=start class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { //暴力解法 //循环匹配, //初始化arr中两个元素均为-1 vector<int> arr(2,-1); for (int i = 0; i < nums.size(); i++) { /* 加速执行(大于目标值,直接返回) */ if(target < nums[i]){ return arr; } //匹配到第一个target时,start与end索引均为此值的索引, //而后的匹配中,仅修改end索引 if(target == nums[i]){ if(arr[0] == -1){ arr[0] = i; arr[1] = i; }else{ arr[1] = i; } } } return arr; } }; // @lc code=end
/* * @lc app=leetcode.cn id=34 lang=cpp * * [34] 在排序数组中查找元素的第一个和最后一个位置 */ // @lc code=start class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { //分别查找startIndex与endIndex int stratIndex = -1; int endIndex = -1; //左右指针 int lp = 0; int rp = nums.size() - 1; int middle = 0; //找出startIndex while(lp <= rp) { middle = lp + (rp - lp) / 2; if(target < nums[middle]) { rp = middle - 1; } else if(target > nums[middle]) { lp = middle + 1; } else if(target == nums[middle]) { stratIndex = middle; //关键:找到一个target时,向左边移动rp,目的是在接下来的循环中找到并确认startIndex的最终值 rp = middle - 1; } } //找出endIndex lp = 0; rp = nums.size() - 1; while(lp <= rp) { middle = lp + (rp - lp) / 2; if(target < nums[middle]) { rp = middle - 1; } else if(target > nums[middle]) { lp = middle + 1; } else if(target == nums[middle]) { endIndex = middle; //找到一个target便将lp向右移动,以确认最终的endIndex lp = middle + 1; } } return {stratIndex,endIndex}; } }; // @lc code=end
本题最终二分解法,二分复用版
/* * @lc app=leetcode.cn id=34 lang=cpp * * [34] 在排序数组中查找元素的第一个和最后一个位置 */ // @lc code=start class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { //分别查找startIndex与endIndex int stratIndex = binarySerach(nums,target,false); int endIndex = binarySerach(nums,target,true); return {stratIndex,endIndex}; } //将上文的找startIndex与endIndex两次二分进行了复用 int binarySerach(vector<int>& nums, int target, bool turn) { int index = -1; //左右指针 int lp = 0; int rp = nums.size() - 1; int middle = 0; //找出Index while(lp <= rp) { middle = lp + (rp - lp) / 2; if(target < nums[middle]) { rp = middle - 1; } else if(target > nums[middle]) { lp = middle + 1; } else if(target == nums[middle]) { index = middle; if(turn){ lp = middle + 1; }else{ rp = middle - 1; } } } return index; } }; // @lc code=end
/* * @lc app=leetcode.cn id=367 lang=cpp * * [367] 有效的完全平方数 */ // @lc code=start class Solution { public: bool isPerfectSquare(int num) { //暴力,由1开始匹配 long square = 1; long x = 1; //num的平方数的平方必定=num,当大于时则num不存在平方数 while(square <= num){ square = x * x; if(square == num){ return true; } x++; } return false; } }; // @lc code=end
/* * @lc app=leetcode.cn id=367 lang=cpp * * [367] 有效的完全平方数 */ // @lc code=start class Solution { public: bool isPerfectSquare(int num) { //1,和num本身左右搜索边界,用常规二分写法即可 long lp = 1; long rp = num; long middle; while(lp <= rp){ middle = lp + (rp - lp) / 2; if(middle*middle < num){ lp = middle + 1; }else if(middle*middle > num){ rp = middle - 1; }else if(middle*middle == num){ return true; } } return false; } }; // @lc code=end
// @before-stub-for-debug-begin #include <vector> #include <string> #include "commoncppproblem69.h" using namespace std; // @before-stub-for-debug-end /* * @lc app=leetcode.cn id=69 lang=cpp * * [69] x 的平方根 */ // @lc code=start class Solution { public: int mySqrt(int x) { //设置搜索边界从1到x long lp = 1; long rp = x; long middle; //x的平方根仅存在两种情况(偏小或偏大) //1.恰好取整数 //2.舍去后取整数 while(lp <= rp) { middle = lp + (rp - lp) / 2; if(middle* middle <= x && (middle+1)*(middle+1) > x){ return middle; }else if(middle*middle > x){ rp = middle - 1; }else{ lp = middle + 1; } } return 0; } }; // @lc code=end
本文来自博客园,作者:main(void),转载请注明原文链接:https://www.cnblogs.com/MR---Zhao/p/18025040
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-02-22 Python 类 初学者笔记