当前位置: 首页 > wzjs >正文

柳州网站建设多少钱宣传产品的方式

柳州网站建设多少钱,宣传产品的方式,烟台seo做的好的网站,网站开发中标签栏的图标一般都在那个文件中写代码LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34) 题目描述:输入输出样例:题解:解题思路:思路一(一次二分查找挨个搜索):思路二(两次二…

LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(一次二分查找+挨个搜索):
        • 思路二(两次二分查找):
      • 代码实现
        • 代码实现(思路一(二分查找+挨个搜索)):
        • 代码实现(思路二(两次二分查找)):
        • 以思路二为例进行调试

题目描述:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

输入输出样例:

示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:
输入:nums = [], target = 0
输出:[-1,-1]

提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109

题解:

解题思路:

思路一(一次二分查找+挨个搜索):

1、通过二分查找找到第一个等于target的元素,若没查找到等于target的元素则返回[-1,-1]。若查找到target的元素,则从此位置开始分别向左向右挨个判断元素值是否为target,直至元素值不等于target为止,此时更新最左侧和最右侧的下标。

2、复杂度分析:
① 时间复杂度:O(n),n代表数组中元素的个数,最坏的情况:数组中的元素都为target。
② 空间复杂度:O(1)。

思路二(两次二分查找):

1、可以通过二分查找先查找到等于target值元素的最左侧下标,再采用二分查找找到等于target值元素的最右侧的下标。
① 当元素值等于target值的时候,再在左侧区间查找是否有等于target值的元素,有则更新等于target的左侧下标,直至左侧子区间不存在等于target值的元素。
② 当元素值等于target值的时候,再在右侧区间查找是否有等于target值的元素,有则更新等于target的右侧下标,直至右侧子区间不存在等于target值的元素。

2、复杂度分析
① 时间复杂度:O(logn),n代表数组中元素的个数。
② 空间复杂度:O(1)。

代码实现

代码实现(思路一(二分查找+挨个搜索)):
class Solution1 {public:vector<int> searchRange(vector<int>& nums, int target) {// 初始化返回的结果为 {-1, -1},表示未找到目标值vector<int> ans = {-1, -1};// 如果数组为空,直接返回 {-1, -1}if (nums.empty()){return ans;}// 初始化二分查找的左右边界int left = 0, right = nums.size() - 1;int mid;// 使用二分查找寻找目标值的某个位置while (left <= right){// 计算中间位置mid = left + (right - left) / 2;// 如果中间值大于目标值,缩小右边界if (nums[mid] > target){right = mid - 1;}// 如果中间值小于目标值,缩小左边界else if (nums[mid] < target) {left = mid + 1;}// 如果找到了目标值,记录当前中间值位置,并跳出循环else {ans[0] = mid; // 目标值的起始位置ans[1] = mid; // 目标值的结束位置break; // 找到目标值,跳出循环}}// 如果找到了目标值(即ans[0]不为-1)if (ans[0] != -1){// 在找到的位置周围扩展,查找目标值的左边界和右边界left = ans[0];right = ans[1];// 从左边界开始,向左扩展,直到不等于目标值为止while (left >= 0 && nums[left] == target){left--;}// 更新目标值的左边界ans[0] = left + 1;// 从右边界开始,向右扩展,直到不等于目标值为止while (right < nums.size() && nums[right] == target){right++;}// 更新目标值的右边界ans[1] = right - 1;}// 返回目标值的范围return ans;}
};
代码实现(思路二(两次二分查找)):
class Solution2 {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> ans = {-1, -1};if (nums.empty()) {return ans;}// 寻找左边界int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1;} else {// 找到目标,继续向左移动 right 确保是最左边的位置right = mid - 1;}}//这里不能使用left<=right来判断是否找到target,因我们再继续查找其他的target时会令最终的left>right// 如果 left 超出了数组范围,或者 nums[left] 不是 target,说明 target 不存在if (left >= nums.size() || nums[left] != target) {return ans;}ans[0] = left;// 寻找右边界right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else {// 找到目标,继续向右移动 left 确保是最右边的位置left = mid + 1;}}ans[1] = right;return ans;}
};
以思路二为例进行调试
#include<iostream>
#include <vector>
using namespace std;class Solution2 {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> ans = {-1, -1};if (nums.empty()) {return ans;}// 寻找左边界int left = 0, right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1;} else {// 找到目标,继续向左移动 right 确保是最左边的位置right = mid - 1;}}//这里不能使用left<=right来判断是否找到target,因我们再继续查找其他的target时会令最终的left>right// 如果 left 超出了数组范围,或者 nums[left] 不是 target,说明 target 不存在if (left >= nums.size() || nums[left] != target) {return ans;}ans[0] = left;// 寻找右边界right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else {// 找到目标,继续向右移动 left 确保是最右边的位置left = mid + 1;}}ans[1] = right;return ans;}
};int main(int argc, char const *argv[])
{vector<int> nums={5,7,7,8,8,10};int target= 8;Solution2 s2;vector<int>ans= s2.searchRange(nums,target);cout<<ans[0]<<"  "<<ans[1];return 0;
}

LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.dtcms.com/wzjs/239806.html

相关文章:

  • 网站建设价格槽闸阀竞价托管哪家效果好
  • 10个国内建筑网站营销百度app下载手机版
  • 怎么介绍自己做的企业网站页面加盟网络营销推广公司
  • 哪些网站可以做微课seo广告投放
  • 做网站还是app宁波seo营销
  • 网站内容图片怎么做的sem是什么意思啊
  • 设计网站 杭州营销比较成功的品牌
  • 微商营销神器优化大师的功能有哪些
  • 网站服务器权限app拉新平台哪个好佣金高
  • 免费建设网站设计页面最新国际新闻事件
  • 东莞品牌网站建设多少钱排名sem优化软件
  • php 用什么做网站服务器吗杭州优化公司在线留言
  • 如何把网站做的和别人一样吗百度网址导航主页
  • 一站式服务平台登录百度一下官网首页登录
  • wordpress怎么做响应式网站推广平台 赚佣金
  • 网站上图片可以做商业作品吗搜索seo神器
  • 学院网站建设策划书徐州百度搜索网站排名
  • 网站花瓣飘落的效果怎么做提高网站搜索排名
  • 网站导航设计法则nba最新资讯
  • 仪器仪表网站制作chrome网页版入口
  • 七冶建设集团网站 江苏逆冬seo
  • 我想投诉做软件的网站南京网站排名提升
  • 怎么用2级目录做网站百度怎么发布自己的广告
  • 个人 备案 经营性网站备案谷歌竞价广告
  • 做网站后的总结太原今日新闻最新头条
  • 做网站获流量交换链接或称互惠链接
  • 企业建站用什么主机站长之家排行榜
  • 手机电脑同步编辑wordpress谷歌seo 外贸建站
  • 医药网站设计杭州seo推广优化公司
  • 奇胜网络 邯郸网站建设百度爱采购官方网站