前缀和算法(类似于动态规划算法)

这篇具有很好参考价值的文章主要介绍了前缀和算法(类似于动态规划算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前缀和介绍

前缀和:在一些特定的题里面,要先把一段连续的数的和先算出来,用数组来接收,然后利用这个数组
返回题目需要的答案

干讲无力 题目解释更好 请往下看

题目:

寻找数组的中心下标

题目:题目链接
前缀和算法(类似于动态规划算法),算法,算法,动态规划,c++,stl,leetcode,哈希算法
题目解析:

在数组中找到一个下标,划分为2个区间 左区间的和=右区间的和,如果没有这个下标则返回-1

题目解答:

因为我们是要找到这个下标 所以我们定义两个dp表(前缀和中的dp表不一定是真正的动规)
一个dp表从左往右相加,一个dp表从右往左相加
然后循环一次 2个dp表 比较 如果 i位置的值 2个dp表相等 那么就那个 位置
细节
因为我们循环的时候
一个是从dp表的左向右 那么 第一个dp表 就要从1开始遍历数组
第二个是从右向左 那么就要 n-2位置开始插入(n是题目给的数组长度)

代码:文章来源地址https://www.toymoban.com/news/detail-766245.html

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

从自身以外数组的乘积

题目:题目链接
前缀和算法(类似于动态规划算法),算法,算法,动态规划,c++,stl,leetcode,哈希算法
题目解析:

返回一个数组,数组中存储的是传过来的数组中 除了这个位置的乘积

题目解答:

因为是要计算除了当前位置的积,我们可以创立一个dp表从前往后遍历相乘,然后在除于当前位置的值,
但是因为有可能传过来的数组中有零 导致,出错,所以我们定义2个dp表
一个dp1表从前往后相乘
一个dp2表从后往前相乘
然后再让dp1中的i-1位置乘dp2中i位置 然后在 / i位置原数组的值
因为我们使用dp表的时候是需要多一个格子来存储一个1(方便存储)
这就避免了 途中有零出错的情况
前缀和算法(类似于动态规划算法),算法,算法,动态规划,c++,stl,leetcode,哈希算法
这个图的第一个没有开辟多一个格子,自己脑补一下。。

代码:

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

}
};

和为K的子数组

题目:题目链接
前缀和算法(类似于动态规划算法),算法,算法,动态规划,c++,stl,leetcode,哈希算法
题目解析:

找到一个连续的子数组中的和等于K,返回个数

题目解答:

因为是找到子数组,所有我们可以用前缀和来统计出现的和为多少
找到一次之后再前缀和数组的值减去前缀和数组中最前面的值
判断他是否大于k 如果大于k再减 减到小于k 然后在往后进行前缀和
因为一个前缀和来统计的话 还要依次遍历 所以时间复杂度还不如暴力枚举
所以我们需要借助一个哈希表来存储
哈希表中的key值存的是 前缀和
如果判断当前哈希表中没有这个前缀和那么会插入并且要让他的值为1
细节:因为如果哈希表中 是要找到k这个值的数组 那么我们要在hash[0]=1
因为如果不初始化的话 那么第一次统计有多少个的时候 会统计成0个
定义一个变量x来存储前缀和
一个变量ret 统计个数
代码可能解释会更好一点

代码:

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) 
    {
        int n = nums.size();
        unordered_map<int,int> hash;//统计前缀和
        hash[0]=1;
        int sum = 0,ret=0;
        for(auto x:nums)
        {
            sum+=x;
            if(hash.count(sum-k))//count()括号中 如果sum-k这个位置
            //在hash中值不为0那么就让ret+=上这个位置的值  那么为真 其他为假
            //例如
            //{0,1};
            //{1,1};
            //{2,1};
            //{3,1};
            //这里sum=3的时候-k 会探查hash[1]位置的值
            //如果为真那么 +=他里面的值
            //下面也是
            //{4,1};这里会找[2]
            //{5,1};[3]
            //{6,1};[4]
            //按照上述操作 就可以找到所有的子数组
            //上述操作可以进行让前缀和减去前面的直到小于k,然后在往后遍历
            {
                ret+=hash[sum-k];
            }
            hash[sum]++;
        }
        return ret;
    }
};

到了这里,关于前缀和算法(类似于动态规划算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 1997.访问完所有房间的第一天:动态规划(DP)——4行主要代码(不需要什么前缀和)

    力扣题目链接:https://leetcode.cn/problems/first-day-where-you-have-been-in-all-the-rooms/ 你需要访问  n 个房间,房间从 0 到 n - 1 编号。同时,每一天都有一个日期编号,从 0 开始,依天数递增。你每天都会访问一个房间。 最开始的第 0 天,你访问  0 号房间。给你一个长度为 n 且 下标从

    2024年04月14日
    浏览(39)
  • LeetCode 1048. Longest String Chain【记忆化搜索,动态规划,哈希表,字符串】中等

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月05日
    浏览(45)
  • LeetCode 2811. Check if it is Possible to Split Array【脑筋急转弯;前缀和+动态规划或记忆化DFS】中等

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月13日
    浏览(35)
  • 算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)

    算法分析与设计考前冲刺 算法基础 算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。 程序是算法用某种程序设计语言的具体的 具体实现 算法特征: 有穷性(有限步) 确定性 输入 输出 可行性(有限时间) 算法的复杂性: 时间复杂性 和空间复

    2024年02月02日
    浏览(44)
  • 并查集维护额外信息,算法思路类似前缀和,结构类似扑克接龙

    240. 食物链 动物王国中有三类动物 A,B,CA,B,C, 这三类动物的食物链构成了有趣的环形 。 AA 吃 BB,BB 吃 CC,CC 吃 AA。 现有 NN 个动物,以 1∼N 1∼N 编号 。 每个动物都是 A,B,CA,B,C 中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这 NN 个动物所构成的

    2024年02月14日
    浏览(39)
  • Leetcode题解-算法-动态规划(python版)

    1.1 爬楼梯 70. 爬楼梯(Easy) 走n阶楼梯的方法有两种,1、先走 1 级台阶,再走 n-1 级台阶;2、先走 2 级台阶,再走 n-2 级台阶 f(n) = f(n-1) + f(n-2) 1.2 强盗抢劫 198. 打家劫舍(Medium) 每个房间财产为 nums[0]……nums[n-1]。 假设 0 至 x 间房获得的最大财产为 f(x)。 f(x) = max(f(x-1),f(x-2)+nums[

    2024年02月03日
    浏览(51)
  • 【算法】动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )

    LeetCode 55. 跳跃游戏 : https://leetcode.cn/problems/jump-game/ 给定一个 非负整数数组 nums ,你最初位于数组的 第一个下标 0 位置 。 数组中的每个元素 代表你在该位置可以 跳跃的最大长度。 判断你 是否能够到达最后一个下标。 给定一个一维数组 , 数组元素不能有负数 , 如 : {2, 2,

    2024年02月10日
    浏览(39)
  • 算法练习Day30 (Leetcode/Python-动态规划)

    62. Unique Paths There is a robot on an  m x n  grid. The robot is initially located at the  top-left corner  (i.e.,  grid[0][0] ). The robot tries to move to the  bottom-right corner  (i.e.,  grid[m - 1][n - 1] ). The robot can only move either down or right at any point in time. Given the two integers  m  and  n , return  the number of possible

    2024年01月20日
    浏览(43)
  • 【数据结构与算法】前缀和+哈希表算法

    关于前缀和和哈希这两个概念大家都不陌生,在之前的文章中也有过介绍:前缀和与差分算法详解 而哈希表最经典的一题莫过于 两数之和 题目链接 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它

    2024年02月01日
    浏览(112)
  • leetcode分类刷题:哈希表(Hash Table)(四、前缀和 处理连续子数组)

    1、leetcode题目里对于 元素加和 的考察可谓是屡见不鲜,包括 简单的限定一个有效答案 的两个或多个元素求和leetcode分类刷题:哈希表(Hash Table)(一、简单的两数之和)、在有序数组内对加和等于target的 三元组、四元组 等的求解leetcode分类刷题:基于数组的双指针(三、

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包