利用动态规划转移做数据结构入门题目

简介: 利用动态规划转移做数据结构入门题目

前言

在leetcode中有一些题目需要利用动态转移的思路去解决问题,这种解决方法能够与最终结果去相匹配,减少了求解过程中的麻烦。

例题1

假如有这么一个数组,要求它的最大子数组和,那么可以肯定每个元素前后都是有联系的。

所以我们有这样一个思路:

数组从头开始移动,用一个变量pre来记录当前数组之和,当走到某个元素时,需要判断pre+当前元素与当前元素的大小,大者返回到pre。如下图,


第一行为数组nums,第二行为pre记录当前数组和大小,这就是动态规划转移的思路,将原数组根据要求转换成新的结果。根据题目要求还需要求最大的数组和,所以还需要一个变量max来记录最大的数组和。

代码如下:

int maxSubArray(int* nums, int numsSize){
    int i=0;
    int pre=0,Max=nums[0];
    //利用动态规划转移的思路
    for(i=0;i<numsSize;i++)
    {
        pre=fmax(pre+nums[i],nums[i]);
        //将指针所指当前数加上pre与之前的pre数相比,返回较大者
        Max=fmax(pre,Max);
        //将之前的最大数与当前pre相比,返回最大者
    }
return Max;
}


当然,由于我是用整型变量来记录,pre与max会随着循环走动而变动,所以上述思路只是画图讲解,不存在另一个数组。下面就讲一条用数组来记录的。

例题2

例如

用一个sum数组来记录动态转移之后的数组


代码如下:

int maxProfit(int* prices, int pricesSize){
//利用动态规划转移的方法
int i=0,max=0;
int min=prices[i];
int* sum=(int*)malloc(sizeof(int)*pricesSize);
sum[0]=0;
for(i=1;i<pricesSize;i++)
{
   min=fmin(min,prices[i]);
   //找出当前最小数
   sum[i]=prices[i]-min;
   //将计算总数转移到sum数组中
}
for(i=1;i<pricesSize;i++)
{
     max=fmax(max,sum[i]);
}
return max;
}`


当然这道题也可以跟上题一样用一个整型变量来记录,这里只是演示一下数组的记录。

例题3

这道题时利用哈希表的方法来解决的,但由于它的范围只有1-9,所以可以利用数组来记录,也就是动态规划转移的思路。但这道题相比前面的题目它从一维数组拓展到二维数组和三维数组。但思路其实是一致的。先分别建立三个数组来记录每个数的多少,将数组的小标对应数独数字的数-1即可。


将row[9]看成一个整体,由于一行有九列,所以是row[9],全部有九个数字,所以是row[9][9];col数组也是同样的道理。而subbox数组,由于是小宫格内看作一个数独,所以subbox[3][3]代表一个小宫格,全部有九个数字,所以是subbox[3][3][9]。理解这一步之后,后面也就简单起来了。

bool isValidSudoku(char** board, int boardSize, int* boardColSize){
//通过建立数组来统计每一行,每一列,每小宫格是否超过1
int row[9][9];
int col[9][9];
int subbox[3][3][9];
//对数组进行初始化
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
memset(subbox,0,sizeof(subbox));
for(int i=0;i<9;i++)
{
    for(int j=0;j<9;j++)
    {
        char c=board[i][j];//c为字符型不是整型
        if(c!='.')
        {
            int index=c-'0'-1;//index为数组的下标
            row[i][index]++;
            col[j][index]++;
            subbox[i/3][j/3][index]++;
            if(row[i][index]>1||col[j][index]>1||subbox[i/3][j/3][index]>1)
            {
                return false;
            }
        }
    }
}
return true;
}

这篇文章就先写到这里,如有错误请在评论区指正。


相关文章
|
1月前
|
存储 机器学习/深度学习 算法
探索数据结构:入门及复杂度的解锁
探索数据结构:入门及复杂度的解锁
|
1月前
|
存储 C语言
栈和队列题目练习
栈和队列题目练习
19 0
|
1月前
|
存储 缓存 应用服务中间件
Nginx入门 -- 基本数据结构中之ngx_hash_t
Nginx入门 -- 基本数据结构中之ngx_hash_t
36 0
|
1月前
|
存储 缓存 应用服务中间件
Nginx入门 -- 基本数据结构中之ngx_list_t,ngx_queue_t
Nginx入门 -- 基本数据结构中之ngx_list_t,ngx_queue_t
27 0
|
1月前
|
存储 应用服务中间件 nginx
Nginx入门 -- 基本数据结构中之ngx_str_t,ngx_array_t
Nginx入门 -- 基本数据结构中之ngx_str_t,ngx_array_t
70 0
|
3月前
|
应用服务中间件 nginx C语言
Nginx入门 -- 基本数据结构中之ngx_str_t,ngx_array_t
这两种数据结构是Nginx自定义数据类型的例子,它们证明了Nginx设计者在构建一个为高并发和高性能优化的web服务器时的精确和高效。理解这些数据结构是深入学习Nginx内部机制的基础,同时也是扩展和开发Nginx模块不可或缺的一部分知识。
40 1
|
4月前
|
算法 数据挖掘 计算机视觉
Python并查集实战宝典:从入门到精通,让你的数据结构技能无懈可击!
【7月更文挑战第17天】并查集,如同瑞士军刀,是解决元素分组问题的利器,应用于好友关系、像素聚类、碰撞检测和连通性分析等场景。本文从基础到实战,介绍并查集的初始化、查找与路径压缩、按秩合并,以及在Kruskal算法中的应用。通过并查集,实现高效动态集合操作,对比哈希表和平衡树,其在合并与查找上的性能尤为突出。学习并查集,提升算法解决复杂问题的能力。
81 5
|
3月前
|
存储 算法 调度
10种 Python数据结构,从入门到精通
10种 Python数据结构,从入门到精通
63 0
|
5月前
|
存储 算法
数据结构与算法之动态规划--旷工问题
数据结构与算法之动态规划--旷工问题
54 1
|
5月前
|
存储 算法 测试技术
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
78 1