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

大型网站制作设计直播软件视频软件

大型网站制作设计,直播软件视频软件,重庆网络公司网站建设,wordpress商城支付本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答。 目录 01 最大子数组和 方法一:动态规划(卡达尼算法) 方法…

本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答。

目录

01 最大子数组和

方法一:动态规划(卡达尼算法)

方法二:二分 + 递推

02 合并区间

方法:排序

03 轮转数组

方法:新建数组

04 除自身以外数组的乘积

方法一:左右乘积列表

方法二:左右乘积列表Plus

05 缺失的第一个正数

方法一:哈希映射

方法二:枚举

方法三:数组改造哈希表

方法四:置换


01 最大子数组和

class Solution {
public:int maxSubArray(vector<int>& nums) {}
};
方法一:动态规划(卡达尼算法)
  • 声明 pre,存储 x之前的最大子数组和,pre = max(pre+x, x)

class Solution {
public:int maxSubArray(vector<int>& nums) {int pre = 0, ans = nums[0];for(const auto& x: nums){pre = max(pre+x, x);ans = max(ans, pre);}return ans;}
};
方法二:二分 + 递推
  • 建立结构体 Status,包含 iSum, lSum, rSum, mSum

  • 采用二分,不断切割区间 [l, r],进行递归,快速下降后缓慢回升

  • 注:if(l == r) return (Status) {a[l], a[l], a[l], a[l]};

class Solution {
public:struct Status{int iSum, lSum, rSum, mSum;};//缓慢回升:递推Status pushUp(Status l, Status r){int iSum = l.iSum + r.iSum;int lSum = max(l.lSum, l.iSum + r.lSum);int rSum = max(r.rSum, r.iSum + l.rSum);int mSum = max(max(l.mSum, r.mSum), l.rSum + r.lSum);return (Status) {iSum, lSum, rSum, mSum};}//快速下降:二分Status get(vector<int>& a, int l, int r){if(l == r) return (Status) {a[l], a[l], a[l], a[l]};int m = (l + r) >> 1;Status lSub = get(a, l, m);Status rSub = get(a, m + 1, r);return pushUp(lSub, rSub);}int maxSubArray(vector<int>& nums) {return get(nums, 0, nums.size() - 1).mSum;}
};

02 合并区间

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {}
};
方法:排序
  • sort 原数组

  • 判断 merged.back()[1] < L,若成立,则添加区间,若不成立,则更新原区间右端点

  • 注:if(intervals.size() == 0) return {}; 

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.size() == 0) return {};sort(intervals.begin(), intervals.end());vector<vector<int>> merged;for(int i=0; i<intervals.size(); ++i){int L = intervals[i][0];int R = intervals[i][1];if(!merged.size() || merged.back()[1] < L) merged.push_back({L, R});else merged.back()[1] = max(merged.back()[1], R);}return merged;}
};

03 轮转数组

class Solution {
public:void rotate(vector<int>& nums, int k) {}
};
方法:新建数组
  • 建立新数组 newArr(n),存储轮转结果 newArr[(i+k)%n] = nums[i];

class Solution {
public:void rotate(vector<int>& nums, int k) {int n = nums.size();vector<int> newArr(n);for(int i=0; i<n; ++i){newArr[(i+k)%n] = nums[i];}nums.assign(newArr.begin(), newArr.end());}
};

nums.assign(newArr.begin(), newArr.end()) 意味着用 newArr 中由 begin()end() 界定的元素范围替换 nums 中原有的元素。

04 除自身以外数组的乘积

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {}
};
方法一:左右乘积列表
  • 建立两个数组 leftSup(n)rightSup(n),存储 i 左侧和右侧元素乘积

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> leftSup(n);leftSup[0] = 1;for(int i=1; i<n; ++i){leftSup[i] = leftSup[i-1] * nums[i-1];}vector<int> rightSup(n);rightSup[n-1] = 1;for(int i=n-2; i>=0; --i){rightSup[i] = rightSup[i+1] * nums[i+1];}vector<int> ans(n);for(int i=0; i<n; ++i){ans[i] = leftSup[i] * rightSup[i];}return ans;}
};
方法二:左右乘积列表Plus
  • 建立一个数组 ans(n),初始存储 i 左侧元素乘积

  • 从右至左,计算 ans(n) 最终值

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> ans(n);ans[0] = 1;for(int i=1; i<n; ++i){ans[i] = ans[i-1] * nums[i-1];}int R = 1;for(int i=n-1; i>=0; --i){ans[i] = ans[i] * R;R *= nums[i];}return ans;}
};

05 缺失的第一个正数

class Solution {
public:int firstMissingPositive(vector<int>& nums) {}
};
方法一:哈希映射

时间复杂度 O(n)、空间复杂度 O(n)

方法二:枚举

时间复杂度 O(n^2)、空间复杂度 O(1)

方法三:数组改造哈希表

时间复杂度 O(n)、空间复杂度 O(1)

  • 遍历数组,所有复数改为 n + 1

  • 遍历数组,判断 abs(nums[i]) <= n,执行 nums[flag - 1] = -abs(nums[flag - 1]);

  • 遍历数组,若每个数都是负数,则答案为 n + 1,否则为第一个整数位置加一

class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();//改负数for(int i=0; i<n; ++i){if(nums[i] <= 0) nums[i] = n + 1;}//添负号for(int i=0; i<n; ++i){int flag = abs(nums[i]);if(flag <= n) nums[flag - 1] = -abs(nums[flag - 1]);}for(int i=0; i<n; ++i){if(nums[i] > 0) return i + 1; //精髓在负号}return n + 1;}
};
方法四:置换
  • 遍历数组,判断 nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i],交换两数,执行 swap(nums[nums[i] - 1], nums[i])

  • 遍历数组,若 nums[i] != i + 1,则答案为 i + 1, 否则为 n + 1

class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();for(int i=0; i<n; ++i){while(nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]){swap(nums[nums[i] - 1], nums[i]);}}for(int i=0; i<n; ++i){if(nums[i] != i + 1){return i + 1;}}return n + 1;}
};

① 为什么 nums[nums[i] - 1] != nums[i] 改成 nums[i] - 1 != i会导致执行超过时间限制?

nums[nums[i] - 1] != nums[i] 可能是位置不同但数值相同,导致无限循环交换。

② 为什么 nums[i] != i + 1 改成 nums[i] - 1 != i会导致执行错误?

nums[i] - 1 作为索引进行比较时,可能会涉及到为负数或超出范围的索引,若 nums[i] 是负数或 0nums[i] - 1 是非法索引,可能导致未定义行为。

文章部分代码来源于力扣(LeetCode)

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

相关文章:

  • 有视频做的很好的网站吗做网站如何使用特殊字体
  • 广州微网站建设dmz100虚拟主机网站淘客网站建设
  • wordpress建视频网站建筑行业一般在哪个网站招聘
  • 网站后台灰色wordpress 伪静态500
  • 做网站需要几个服务器重庆做网站建设哪家好
  • 公司概况-环保公司网站模板南京装饰公司网站建设
  • 凡科建站是永久的吗百度网站v认证
  • 合肥婚恋网站建设10m网站并发量
  • 建设网站平台哪里最好wordpress内容模型
  • 容桂网站建设公司网上注册网站要钱吗
  • 网站怎么百度收录怎么把网站排名
  • 展览网站建设高校门户网站系统
  • 怎么找合适的网站开发CQ网络科技网站建设
  • 如何做自己的播报网站驻马店 网站建设
  • 网站仿做软件可以做设计兼职的网站
  • 合肥建站巴音郭楞蒙古自治州建设局网站
  • 网站建设考虑哪些因素大连网站建设腾讯大厦
  • 网站logo怎么做谷歌google浏览器
  • 手机网站案例网站制作厂家电话多少
  • 企业网站首页的实现阳江网站推广优化公司
  • 洛阳网站建设费用网络营销岗位技能
  • HTML做网站的书籍手机网站建设过程
  • 网站建设工作室制作平台wordpress 图片存储
  • 鞍山商城网站建设深圳网站建设价格多少钱
  • 保洁公司做网站有什么作用做网站建设优化的公司排名
  • 网站如何不需要备案wordpress 微信 抓取
  • _网站建设网站私密浏览器免费看片在线看
  • 建筑网站的功能模块杭州网站优化流程
  • 国家对地理信息网站建设的重视网站开发主要用什么语言
  • 手机网站建设与制作专业室内设计 官网