Leetcode 5274. 停在原地的方案数
纪念第一次正式参加,听说这次题目很水,感觉确实不是很难,一般前两题都很简单,这次,到第三题的时候,都还可以做,emm......
实际代码记录:
#include <iostream>
#include <vector>
#include <math.h>
#include <string>
#include <algorithm>
using namespace std; /*
* 功能:初始化m行n列的二维vector
* 参数:m,n,vector
*/
void init(int m, int n, vector<vector<int> > &vc) {
//初始化一个数组m行 n列
vector<int> level;
level.resize(n);
vc.resize(m, level);
for (int i = ; i < m;i++)
{
for (int j = ; j < n; j++)
{
cin >> vc[i][j];
}
}
} /*
* 功能:输出vector
* 参数:vector
*/
void vecPrint(const vector<vector<int> > vc)
{
//输出
cout << "The vector vc is as follow:" << endl;
int m = vc.size();
int n = vc[].size();
for (int i = ; i < m; i++)
{
for (int j = ; j < n; j++)
{
cout << vc[i][j] << "\t";
}
cout << endl;
}
} int minTimeToVisitAllPoints(vector<vector<int> >& points) {
int m = points.size();
int n = ; //只存在横纵坐标,两个
int cost_time = ; //记录总时间
int x1, x2, y1, y2;
for (int i = ; i < m; i++)
{
//记录两个点
x1 = points[i - ][];
y1 = points[i - ][];
x2 = points[i][];
y2 = points[i][]; //计算两个点之间的最小时间
if (x1 == x2) {
//位于同一条直线上
cost_time += abs(y1-y2);
}
else if (y1 == y2) {
cost_time += abs(x1 - x2);
}
else if (x1 < x2 && y1 < y2) {
//位于右上方
while (x1 < x2 && y1 < y2)
{
x1++;
y1++;
cost_time++;
}
//底下至少有一个为0
cost_time += abs(x1 - x2);
cost_time += abs(y1 - y2);
}
else if (x1 > x2 && y1 < y2) {
//位于左上方
while (x1 > x2 && y1 < y2)
{
x1--;
y1++;
cost_time++;
}
//底下至少有一个为0
cost_time += abs(x1 - x2);
cost_time += abs(y1 - y2);
}
else if (x1 > x2 && y1 > y2) {
//位于左下方
while (x1 > x2 && y1 > y2)
{
x1--;
y1--;
cost_time++;
}
//底下至少有一个为0
cost_time += abs(x1 - x2);
cost_time += abs(y1 - y2);
}
else if (x1 < x2 && y1 > y2) {
//位于右下方
while (x1 < x2 && y1 > y2)
{
x1++;
y1--;
cost_time++;
}
//底下至少有一个为0
cost_time += abs(x1 - x2);
cost_time += abs(y1 - y2);
}
}
return cost_time;
} int countServers(vector<vector<int>>& grid) {
//对每行没列进行标记
int result = ;
int i, j, k;
for (i = ; i < grid.size(); i++)
{
for (j = ; j < grid[].size(); j++)
{
if (grid[i][j] == ) {
//看i行或j列是否存在i
int flag = ;
for (k = ; k < grid.size(); k++)
{
if (k != i && grid[k][j] == )
{
result += ;
flag = ; //表示行找到了
break;
}
}
if (flag == ) { //如果行没有找到,需要找列
for (k = ; k < grid[].size(); k++)
{
if (k != j && grid[i][k] == )
{
result += ;
break;
}
}
}
}
}
}
return result;
} /*
int main()
{ int m, n;
cin >> m >> n;
vector<vector<int> > vc;
init(m,n,vc);
vecPrint(vc);
//cout << minTimeToVisitAllPoints(vc) << endl;
cout << countServers(vc) << endl; return 0;
}
*/ vector<vector<string> > suggestedProducts(vector<string>& products, string searchWord) {
vector<vector<string> > result;
//vector<string> level = products; //处理level
//sort排序试试
sort(products.begin(), products.end());
//输出查看效果
int i;
/*
for (i = 0; i < products.size(); i++) {
cout << products[i] << endl;
}
*/
//排序结束,然后进行查找
int len = searchWord.length();
int k=;
while (len--)
{
int count = ;
string condistr; //候选字符串
condistr = searchWord.substr(, k);
//cout << "候选模式串为:" << condistr << endl;
vector<string> level;
for (i = ; i < products.size(); i++)
{
if (products[i].substr(, k) == condistr)
{
if (count < )
{
level.push_back(products[i]);
count++;
cout << products[i] << " ";
} }
}
cout << endl;
result.push_back(level);
level.clear();
k++;
}
return result;
} /*
int main()
{
vector<string> result;
string str;
int k;
cin >> k;
while (k--)
{
cin >> str;
result.push_back(str);
}
suggestedProducts(result,"mouse");
return 0;
}
*/ /*
5
mobile
mouse
moneypot
monitor
mousepad
*/
题目:(前三题比较简单,只总结最后一题)
有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。
每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。
给你两个整数 steps 和 arrLen ,请你计算并返回:在恰好执行 steps 次操作以后,指针仍然指向索引 0 处的方案数。
由于答案可能会很大,请返回方案数 模 10^9 + 7 后的结果。
示例 1:
输入:steps = 3, arrLen = 2
输出:4
解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。
向右,向左,不动
不动,向右,向左
向右,不动,向左
不动,不动,不动
理解:
方案一、(自己的想法)
拿到这道题的第一想法是,枚举解答树,只有三种走法,左走,不动,右走,那么我可以申请一个数组d[3],初始化该数组为d[3]={-1,0,1},即可以将当前的索引位置想象成数轴上的原点坐标,当前位置为pos,往左走一步,位置变为pos-1,不动的情况位置仍为pos,往右走一步,位置变为pos+1。利用一个解答树,判断走了steps步以后,是否为原点0,即可求得最终解;
以示例1为例,我们可以画一棵树,如下所示:
注意:1.当位于原点0时,向左走到了-1的位置,超出了最左限制,当位于数组末尾时,向右走到了2的位置,超出了最右限制;
2.当遍历到最后一步,即最后一层时,我们如果总和sum等于0,说明经过上三步之后,仍位于原点位置,否则直接return。
因此,我们总结出如下代码:(不考虑模100000007的结果)
代码如下:
class Solution {
public:
int d[] = { ,-, }; //不动,左,右
int count = ;
int sum = ;
int numWays(int steps, int arrLen) {
dfs(,steps,arrLen,sum);
return count;
} void dfs(int depth,int step,int arrLen,int sum) //step
{
if (depth >= step)
{
if (sum == )
count++;
return;
}
if (sum < || sum >= arrLen)
return;
for (int i = ; i < ; i++)
{
dfs(depth + ,step,arrLen,sum+d[i]);
}
}
};
很遗憾,这样的递归遍历方式,在27步的时候,就超时了,但是贴到这儿是为了学习,哈哈!
方案二、(学习别人的动态规划思想)
学会再来补充啦~
Leetcode 5274. 停在原地的方案数的更多相关文章
- 【js】Leetcode每日一题-停在原地的方案数
[js]Leetcode每日一题-停在原地的方案数 [题目描述] 有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处. 每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指 ...
- leetcode-164周赛-1269-停在原地的方案数
题目描述: 自己的提交: class Solution: def numWays(self, steps: int, arrLen: int) -> int: l = min(steps,arr ...
- LeetCode 5274. Number of Ways to Stay in the Same Place After Some Steps - Java - DP
题目链接:5274. 停在原地的方案数 You have a pointer at index 0 in an array of size arrLen. At each step, you can ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- Codeforces 461B. Appleman and Tree[树形DP 方案数]
B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- NOIP2012pj摆花[DP 多重背包方案数]
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- UVa 11137 (完全背包方案数) Ingenuous Cubrency
题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...
- 删数方案数(regex)
[题目描述] 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同 ...
- poj2975 Nim 胜利的方案数
Nim Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5545 Accepted: 2597 Description N ...
随机推荐
- thinkphp3.2.3使用formdata的多文件上传
使用formdata的多文件上传 废话少说 直接上代码 1 JS部分 //选择文件后的处理 function handleFileSelect() { var exerciseid=$(" ...
- 初识AspNet Core中的标识Identity
AspNet Core中的标识Identity,是用于Web应用程序的成员身份验证系统. 最方便的引入办法是在创建MVC或Pages的Web应用时,直接选择相应的身份验证系统.如图: 如果选择的是“个 ...
- Linux目录结构(1)
/bin[重点](/usr/bin./usr/local/bin):存放常用命令 /sbin:存放的是系统管理员使用的系统管理程序 /home[重点]:存放普通用户的主目录,在linux中每个用户都有 ...
- 编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件
错误提示: ~/opencv_contrib/modules/xfeatures2d/src/boostdesc.:: fatal error: boostdesc_bgm.i: No such fi ...
- javascript:void(0); 和 href = "#"
在做页面时,如果想做一个链接点击后不做任何事情,或者响应点击而完成其他事情,可以设置其属性 href = "#", 但是,这样会有一个问题,就是当页面有滚动条时,点击后会返回到页面 ...
- 机器学习之KMeans聚类
零.学习生成测试数据 from sklearn.datasets import make_blobs from matplotlib import pyplot # create test data ...
- 《linux就该这么学》课堂笔记15 vsftpd文件传输、Samba/NFS文件共享
1.为了能够在如此复杂多样的设备之间(Windows.Linux.UNIX.Mac等不同的操作系统)解决问题解决文件传输问题,文件传输协议(FTP)应运而生. FTP服务器是按照FTP协议在互联网上提 ...
- Two-Stream Adaptive Graph Convolutional Network for Skeleton-Based Action Recognition
Two-Stream Adaptive Graph Convolutional Network for Skeleton-Based Action Recognition 摘要 基于骨架的动作识别因为 ...
- seq2seq模型详解及对比(CNN,RNN,Transformer)
一,概述 在自然语言生成的任务中,大部分是基于seq2seq模型实现的(除此之外,还有语言模型,GAN等也能做文本生成),例如生成式对话,机器翻译,文本摘要等等,seq2seq模型是由encoder, ...
- 接口测试:postman
测试接口,postman和jmeter是用得最频繁的工具. 下面主要介绍postman测试http协议接口的用法,包含get,post(form-data,json,上传文件,cookie). pos ...