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

C++ 前缀和、双指针

前缀和代码分析:

第一步:预处理

function initPrefixSum(a, sum, size)

  sum[0]  = a[0];

  for i -> (1, size-1)

       sum[i] = sum[i-1] + a[i];

第二步:查询

function getPartialSum(sum, l, r)

  if l==0

     return sum[r]

return sum[r] - sum[l-1]

第一次-内存优化:

function initPrefixSum(a, size)

  for i -> (1, size-1)

       a[i] = a[i-1] + a[i];

代码练习 1 对应力扣 一维数组的动态和,代码见下

class Solution {
public:vector<int> runningSum(vector<int>& nums) {vector<int> runningSum;runningSum.push_back(nums[0]);for(int i=1; i<nums.size(); ++i){int x = runningSum[i-1] + nums[i];runningSum.push_back(x);}return runningSum;}
};

代码练习 2 对应力扣 找到数组的中间位置 代码见下

class Solution {
public:int findMiddleIndex(vector<int>& nums) {int sum[210];int n = nums.size();sum[0] = nums[0];for(int i = 1; i < n; ++i){sum[i] = sum[i-1] + nums[i];}for(int i = 0; i < nums.size(); ++i){int middleIndex = i;int a = 0, b = 0;if(middleIndex)a = sum[middleIndex - 1];b = sum[n-1] - sum[middleIndex];if(a == b){return middleIndex;}}return -1;}
};

代码练习,对应力扣,寻找数组的中心下标,代码见下

class Solution {
public:int pivotIndex(vector<int>& nums) {int n = nums.size();for(int i = 1; i < n; ++i){nums[i] += nums[i-1];}for(int i = 0; i < nums.size(); ++i){int middleIndex = i;int a = 0, b = 0;if(middleIndex)a = nums[middleIndex - 1];b = nums[n-1] - nums[middleIndex];if(a == b){return middleIndex;}}return -1;}
};

双指针:

快慢指针:就是两个指针,从同一侧开始遍历序列,移动步长一个快一个慢。常见应用有,链表判环,获取链表中间结点,删除有序数组重复项。

对撞指针:是指两个指针,分别指向序列的第一个元素和最后一个元素,然后指针相向移动,一个指针递增一个指针递减,直到两个指针值相撞或者满足其他特殊条件为止。常见应用有,两数之和,回文串判定,字符串的反转等等

分离双指针:两个指针分别属于不同的数组(或链表),两个指针分别在两个数组(或链表)中移动,从而解决相关算法问题,常见应用,有序数组合并,归并排序中的合并部分,对两数组求交集和并集。这个的优点便可以降低时间复杂度。

代码分析:

求链表的中点

function middleNode(head)

  slow=fast=head

  while fast and fast.next

    slow = slow.next

    fast = fast.next.next

return slow

数组中移除元素

function removeElement(arr, n, val)

  l = 0

  r = n - 1

  while(l <= r)

    if(arr[l] == val)

       arr[l] = arr[r]

       r -= 1

    else

      l += 1

return l

代码练习,对应蓝桥云课 回文判定 代码见下

#include <iostream>
#include<string>
using namespace std;
int main()
{string s;cin >> s;int i = 0;int j = s.size() - 1;while(i < j){if(s[i] != s[j]){break;}i += 1;j -= 1;}if(i >= j){cout << 'Y' << endl;}else{cout << 'N' << endl;}// 请在此输入您的代码return 0;
}

代码练习,对应蓝桥云课 反转字符串中的字符,代码见下

#include <iostream>
#include <string.h>
using namespace std;char s[1000];int main()
{cin.getline(s, 101, '\n');int i = 0;int j = strlen(s) - 1;while(i < j){swap(s[i], s[j]);i += 1;j -= 1;}cout << s << endl;// 请在此输入您的代码return 0;
}

代码练习,对应蓝桥云课 等腰三角形 代码见下

#include <iostream>
#include <algorithm>
using namespace std;#define maxn 200001
int A[maxn], B[maxn], C[maxn];
int n;int main()
{cin >> n;for(int i=0; i<n; ++i){cin >> A[i];C[i] = 2 * A[i];}for(int i=0; i<n; ++i){cin >> B[i];}sort(C, C+n);sort(B, B+n);int i=0, j=0, ans=0;while(i < n && j < n){if(C[i] > B[j]){j += 1;ans += 1;}i += 1;}cout << ans << endl;// 请在此输入您的代码return 0;
}

http://www.lryc.cn/news/607364.html

相关文章:

  • Node.js中Buffer的用法
  • 嵌入式第十七课!!!!位运算!!!
  • 考取锅炉司炉工证需要学习哪些专业知识?
  • Linux 用户与组管理:从配置文件到实操命令全解析
  • golang的函数
  • YOLO V11 + BotSort行人追踪定位项目
  • 风光储并离网切换仿真模型(下垂控制一次调频)
  • 详解K8s集群搭建:从环境准备到成功运行
  • 【问题思考总结】CART树如何剪枝?从CART树的生成到剪枝以及为什么CTt一定小于Ct?【图文】
  • 在多租户或多服务共享 Redis 时,如何做逻辑隔离或权限控制?
  • 【数据结构】-----排序的艺术画卷
  • ESD监控系统确保工厂生产设备的静电安全
  • 浏览器【详解】内置Observer(共五种,用于前端监控、图片懒加载、无限滚动、响应式布局、生成安全报告等)
  • cesium FBO(四)自定义相机渲染到Canvas(离屏渲染)
  • 开源工具FossFLOW,绘制技术图表
  • 嵌入式GPU图像渲染工具全景实用指南(i.MX8MP平台)
  • Python深度解析与爬虫进阶:从理论到企业级实践
  • ubuntu 镜像克隆
  • Git 实现原理剖析
  • 【编号394】阿姆河流域土地利用分布数据(1990-2015)
  • 智能问数系统的调研
  • 【工具分享】模拟接口请求响应的Chrome插件ModResponse
  • 什么是doris
  • 第七章 愿景12 小萍分享《人性的弱点》
  • 软件性能优化:善用80-20法则,精准突破瓶颈
  • grafana/lock-stack 日志 Pipeline 配置
  • 前端渲染三国杀:SSR、SPA、SSG
  • npm报错:npm install 出现“npm WARN old lockfile”
  • 工程化(二):为什么你的下一个项目应该使用Monorepo?(pnpm / Lerna实战)
  • R 语言文件读写、批量读取与图片保存实用代码汇总