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

做网站需要公司我的WordPress网站

做网站需要公司,我的WordPress网站,wordpress只有vip会员下载,推广网站链接怎么做今天,带来数组相关算法的讲解。文中不足错漏之处望请斧正! 理论基础点这里 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输…

今天,带来数组相关算法的讲解。文中不足错漏之处望请斧正!

理论基础点这里


有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序

进阶:

请你设计时间复杂度为 O(n) 的算法解决本问题

1. 思路

只有正数时,平方的大小就是从头到尾即由小到大。

在这里插入图片描述

那顺序遍历升序数组,作平方,就能得到升序结果。

但有负数时该怎么办?最小的平方应该是从两端趋向中间的最接近0的那个值。
在这里插入图片描述

从这个值往两边走,谁的平方大,谁就先插入结果集。题目要求升序,那我们就从结果集的尾部到结果集的头部放入结果。

要“往两边走”我们用双指针从两边遍历就好啦,谁大谁先插入结果数组。

2. 参考代码

class Solution {
public:// 找0, 双指针从两头向中间找, 平方和大的插入结果集的后面vector<int> sortedSquares(vector<int>& nums) {vector<int> result(nums.size());int left = 0;int right = nums.size() - 1;int insertIndex = result.size() - 1;while (left <= right) { // left==righrt时, nums[left]的平方和也要插入结果集long long squre1 = pow(nums[left], 2);long long squre2 = pow(nums[right], 2);if (squre1 > squre2) {result[insertIndex--] = squre1;++left;} else {result[insertIndex--] = squre2;--right;}}return result;}
};

长度最小的子数组

1. 思路

理解题意

分析如何满足需求

1.1 暴力遍历

两层for,一个指针确定当前想遍历的区间的起始位置,另一个指针遍历来确定终止位置,把所有可能的区间都遍历一遍,一旦区间和大于target,就对比并取最小的长度。

参考代码如下:

class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {int minLen = INT_MAX;int sum = 0; // 子序列的数值之和int subLength = 0; // 子序列的长度for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为isum = 0;for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为jsum += nums[j];if (sum >= s) { // 一旦发现子序列和超过了s,更新resultsubLength = j - i + 1; // 取子序列的长度result = result < subLength ? result : subLength;break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break,不要再累加元素了}}}return result == INT_MAX ? 0 : result;}
};
1.2 滑动窗口

暴力的方法比较死板:直接把所有可能得区间都遍历一遍。每一次都是静态确认好一个区间 [i, j] ,再累加求结果,有没有办法更灵活地确认这个连续子数组地区间呢?有的。

我们可以维护一个连续子数组的区间(右边的指针固定走,左边的指针能跟就跟,保证长度最小),——滑动窗口。

什么是滑动窗口?其实是双指针的一种应用,两个指针动态移动,维护一个区间,像滑动的窗口一样。

滑动窗口在本题中怎么用呢?

在这里插入图片描述

为什么是end固定往后走,begin根据策略走?

首先,end必须把整个数组遍历一遍;其次,begin作为起始位置,不一定需要固定走(如果区间和不大于等于target,走了有什么意义呢)。

end遍历给定数组nums,当区间和大于target的时候,就得到了当前最小的连续子序列但不是最终的。所以在end往后移动的时候,begin也要根据一定策略追赶end,保证得到最终的最小连续子序列。

begin到底是怎样移动的呢?
  • 如果当前区间是连续子数组,begin就要移动
  • 如果当前区间不是连续子数组,那么begin就不能移动

这样子移动,每次begin移动完,[begin, end]的和都会小于target(不再是连续子数组),但这不影响,因为在它最后还是连续子数组的时候,我们已经用minLen记录了它的长度。这样走下去,就能获取到最短的长度。

2. 参考代码

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int begin = 0; // [begin, end] 就是期望的最短子数组区间int end = 0;int curLen = 0;int minLen = INT_MAX;long long sum = 0;while (end < nums.size()) {sum += nums[end];while (sum >= target) { // 已经是子数组, 开始缩减长度curLen = end - begin + 1;minLen = min(curLen, minLen);sum -= nums[begin++]; // 缩减长度}++end;}return minLen == INT_MAX ? 0 : minLen;}
};

今天的分享就到这里了,感谢您能看到这里。

这里是培根的blog,期待与你共同进步!

http://www.yayakq.cn/news/428865/

相关文章:

  • 网站改版重新备案惠州seo排名优化
  • 上海企业网站建设哪家好视频模板套用免费
  • 怎么做购物网站长沙旅游网站制作
  • 昆明做网站价格沙坪坝网站建设
  • 网站有多难做简要说明网站建设的步骤
  • 做网站要注册商标第几类网站的建设需要数据库
  • 广州建站培训学校怎么建网站不用买空间
  • 电子商务网站建设与维护案例做设计网站赚钱吗
  • 北大学风建设网站网站开发实用技术第2版课后答案
  • 网站怎么添加代码图片网站收录
  • 建设网站宝安区文昌建设局网站
  • 成交型网站建设公司网站的建设方法有哪些
  • 360建站工具贷款网站建设
  • 华建设计网站手机app下载官方免费下载安装
  • 内蒙古自治区工程建设网站app软件开发学什么专业
  • html5网站欣赏 国内导航站wordpress
  • 网站怎么推广引流wordpress 导出export.php
  • 建站最少需要多少钱用cms创建自己带数据库的网站和在本机搭建网站运行平台的心得体会
  • 织梦源码怎样做单页网站自建网站如何备案
  • 适合女生做的网站门户网站安全建设
  • 网站建设推广方案书注册网址的网站
  • 52做网站沈阳网站建设小志
  • 华为网站建站鲜花网站建设源代码
  • 安庆市建设办事处网站thinkphp3.2 企业网站源码
  • app的网站域名注册文化建设宣传标语
  • 优化网站速度的要点易申建设网站
  • 网站开发学习步骤会员管理系统设计
  • 天津做网站的公司有哪些网站建设选题
  • 贵阳有哪些可以制作网站的公司吗顺企网吉安网站建设
  • 海外网站的建设wordpress企业网站源码