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

8.3 滑窗 |栈|阶乘判断

 

 

 

lc2106

 

k步定长滑动窗口

两种情况:start单侧 or 有折返

 

折返处理:

 

while ( (fruits[right][0] - fruits[left][0] + min(startPos - fruits[left][0], fruits[right][0] - startPos)) > k )

         {
curSum -= fruits[left][1];
left++;
}

class Solution {
public:
int maxTotalFruits(vector<vector<int>>& fruits, int startPos, int k) {
int n = fruits.size();
int left = 0;
while (left < n && fruits[left][0] < startPos - k) {
left++;
}

        int right = left;
int curSum = 0;


while (right < n && fruits[right][0] <= startPos) {
curSum += fruits[right][1];
right++;
}

        int maxSum = curSum;


while (right < n && fruits[right][0] <= startPos + k)

{
curSum += fruits[right][1];
while ( (fruits[right][0] - fruits[left][0] + min(startPos - fruits[left][0], fruits[right][0] - startPos)) > k ) {
curSum -= fruits[left][1];
left++;
}


maxSum = max(maxSum, curSum);
right++;
}

        return maxSum;
}
};

用双指针的方法,算从起点出发、最多走k步能捡到多少水果:

1. 先找左边最远能到的位置(离起点不超过k步),确定左指针起点
2. 先统计从左指针到起点范围内的所有水果
3. 然后右指针慢慢向右移(不超过起点+k步),每次加上新位置的水果
4. 过程中如果左右距离太远、超了k步,就把左指针右移,减去左边的水果
5. 随时记录能捡到的最多水果数,最后返回这个最大值

核心就是 用左右指针框出一个“在k步内”的范围,不断调整范围并算总数,找最大的那个。

 

lc32.括号

class Solution {
public:
int longestValidParentheses(string s)

{
int num = s.size();
int ans = 0;
int start = -1;
vector<int> stack;
for(int i = 0; i < num; i++)

      {
if(s[i] == '('){
stack.push_back(i);
}
else

            {
if(stack.empty())

               {
start = i;
}
else{
stack.pop_back();
if(stack.empty())

                    {
ans = max(i - start, ans);
}
else{
ans = max(i - stack.back(), ans);
}
}
}
}
return ans;
}
};

 

lc60 排列序列

逐位确定每一位的数字:

  • 按位确定1到n的第k个排列,每步用剩余位数的排列数(n-i)!
  • 判断选哪个数,不够就减k,够就选定该数。

 class Solution {

public:

    string getPermutation(int n, int k)

{

        string a;

        vector<bool> u(10, false);

        

        for (int i = 0; i < n; i++) 

        {

            int f = 1;

            for (int j = 1; j <= n - i - 1; j++) 

            f *= j;//阶乘计算

            

            for (int j = 1; j <= n; j++) 

            {

                if (!u[j]) 

                {

                    if (f < k) k -= f;

                //数字枚举

                

                    else

                    {

                        a += to_string(j);

                        u[j] = true;

                        break;

                    }

                }

            }

        }

        return a; 

    }

};

 

http://www.xdnf.cn/news/1234657.html

相关文章:

  • 什么是列存储(Columnar Storage)?深度解析其原理与应用场景
  • 【领域热点】【Vue】Vue 与 WebAssembly:前端性能优化的黄金搭档
  • [创业之路-535]:软件需要原型验证、产品需要原型验证、商业模式也需要原型验证
  • 实战解析:编程式事务在实际开发中的典型应用场景
  • Linux系统编程Day4-- Linux常用工具(yum与vim)
  • vulhub-corrosion2靶机
  • 1.8 axios详解
  • Unix 发展史概览
  • ClickHouse Windows迁移方案与测试
  • 一键安装RabbitMQ脚本
  • 电脑声音标志显示红叉的原因
  • 决策树的实际案例
  • Python-初学openCV——图像预处理(六)
  • Linux网络编程 ---五种IO模型
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各类垃圾的分类检测识别(C#代码UI界面版)
  • 基于MBA与BP神经网络分类模型的特征选择方法研究(Python实现)
  • Java学习第一百部分——Kafka
  • (论文速读)探索多模式大型语言模型的视觉缺陷
  • 关于Web前端安全防御之内容安全策略(CSP)
  • 大语言模型涉及的一些概念(持续更新)
  • Azure DevOps 中的代理
  • 知识点汇集(二)-misc
  • 【数据结构】哈希表实现
  • 数据结构:在链表中插入节点(Inserting in a Linked List)
  • 蛇形卷积介绍
  • AVDTP Media Packet 报文深度解析:蓝牙音频流的幕后功臣
  • Celery-分布式任务队列
  • linux2.6 和 unix-v6 源码实验
  • K8S服务发现原理及开发框架的配合
  • 利用AI渲染技术提升元宇宙用户体验的技术难点有哪些?