力扣1423. 可获得的最大点数-C语言
题目
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
示例 1:
输入:cardPoints = [1,2,3,4,5,6,1], k = 3
输出:12
解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。
示例 2:
输入:cardPoints = [2,2,2], k = 2
输出:4
解释:无论你拿起哪两张卡牌,可获得的点数总是 4 。
示例 3:
输入:cardPoints = [9,7,7,9,7,7,9], k = 7
输出:55
解释:你必须拿起所有卡牌,可以获得的点数为所有卡牌的点数之和。
示例 4:
输入:cardPoints = [1,1000,1], k = 1
输出:1
解释:你无法拿到中间那张卡牌,所以可以获得的最大点数为 1 。
示例 5:
输入:cardPoints = [1,79,80,1,1,1,200,1], k = 3
输出:202
提示:
1 <= cardPoints.length <= 10^5
1 <= cardPoints[i] <= 10^4
1 <= k <= cardPoints.length
题解模板(C)
int maxScore(int* cardPoints, int cardPointsSize, int k){
}
解题
对于题设我们可以很明显知道题目的目的是从一个固有的整型数组里面从两端取出卡牌,数量有限,同时,返回最大取出的值,可以反过来思考题目的意思就是:
你要使得取出来的和是最大的就要使得留下来的和是最小的,大小长度是固定的,所以对于剩下的长度推演就是对于原有的最大长度减去你所要取出的部分的长度,就是剩下的长度,同时,又知道他是两边开始取出的,所以最后余下的是一个连续的子数组
题设长度为cardPointSize,取出k个卡牌
就可以转化为对这个长度为cardPointSize的数组取出其内部长度为(carrPointSize-k)的最小子数组,这就转化成了简单的滑动窗口了。
参考两天前的题目,这个就很简单了
int maxScore(int* cardPoints, int cardPointsSize, int k){
int sum = 0;
int all=0;
for( int i = 0; i < cardPointsSize ; i++)
all += cardPoints[i];//计算所有总和
for( int i = 0; i < cardPointsSize - k; i++)
{
sum += cardPoints[i];//计算第一窗口和
printf("sum=%d ,",sum);
}
int minsum= sum;//暂得最小值
for(int i = cardPointsSize - k; i < cardPointsSize; i++)
{
sum = sum - cardPoints[i - cardPointsSize+k]+cardPoints[i];//以固定长度滑动窗口
printf("sum=%d ,",sum);
minsum = fmin(sum ,minsum);//窗口最小值更新
printf("minsum=%d ;",minsum);
}
return (all-minsum);
}
想要自己测试的小伙伴可以拷贝下面的代码在自己的编译器上测试
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int maxScore(int* cardPoints, int cardPointsSize, int k);
int main()
{
int cardPoints[]={1,79,80,1,1,1,200,1};
int max=maxScore(cardPoints,8,3);
printf("%d",max);
}
int maxScore(int* cardPoints, int cardPointsSize, int k){
int sum = 0;
int all=0;
for( int i = 0; i < cardPointsSize ; i++)
all += cardPoints[i];//计算所有总和
for( int i = 0; i < cardPointsSize - k; i++)
{
sum += cardPoints[i];//计算第一窗口和
printf("sum=%d ,",sum);
}
int minsum= sum;//暂得最小值
for(int i = cardPointsSize - k; i < cardPointsSize; i++)
{
sum = sum - cardPoints[i - cardPointsSize+k]+cardPoints[i];//以固定长度滑动窗口
printf("sum=%d ,",sum);
minsum = fmin(sum ,minsum);//窗口最小值更新
printf("minsum=%d ;",minsum);
}
return (all-minsum);
}
再贴上一张运行图,截取了最好看的数据
力扣1423. 可获得的最大点数-C语言的更多相关文章
- 力扣485. 最大连续1的个数-C语言实现-简单题
题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- JS数据结构第六篇 --- 二叉树力扣练习题
1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...
- 力扣—Reorder List(重排链表)python实现
题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...
- 【LeetCode】1423. 可获得的最大点数 Maximum Points You Can Obtain from Cards (Python)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,滑动窗口,递归,前缀和,preSum,刷题群 目录 题目描述 解题思路 递归 ...
- 力扣算法题—069x的平方根
实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法
题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...
- LeetCode 1244. 力扣排行榜
地址 https://www.acwing.com/solution/LeetCode/content/5765/ 题目描述新一轮的「力扣杯」编程大赛即将启动,为了动态显示参赛者的得分数据,需要设计一 ...
随机推荐
- 建立索引和创建视图(结合YGGL.sql)
一.请按要求对YGGL库建立相关索引 (1)使用create index 语句创建索引 1.对employees表中的员工部门号创建普通索引depart_ind. mysql> create i ...
- Docker-MsSqlServer和安装版本异同
创建SqlServer容器 docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd&g ...
- 记一次flask上传文件返回200前端却504的问题
前言 好久没写了, 主要是太忙了, 本篇记一下今天解决的一个问题吧, 耗了我大半天的时间才解决 问题 今天在调试代码时, 发现了一个诡异的问题, 我之前写了一个接口, 作用是接收上传的文件, 因为这个 ...
- 【Linux】关于CentOS系统中,文件权限第11位上是一个点的解读
------------------------------------------------------------------------------------------------- | ...
- 【Oracle】win7安装报错
在WIN7上安装oracle 10g时,提示如下信息: 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为: 失败 &l ...
- 【Oracle LISTNER】oracle Listener 宕机解决办法
今天想起了很久没用的oracle库,用plsql尝试连接,发现报超时错误,以为是偶然,多次尝试连接,发现还是超时,于是登录到系统中,查看数据库情况,发现正常查询和修改添加,感觉不是数据库问题,查看监听 ...
- 【Oracle】DRM官方介绍
DRM 简介 By: Allen Gao 首先,我们对和DRM 相关的一些概念进行介绍. Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer ...
- Test typora
目录 0. test 0.5 easy test 1. problem 1 2. problem 2 3. problem 3 import numpy as np import matplotlib ...
- 训练分类器 - 基于 PyTorch
训练分类器 目前为止,我们已经掌握了如何去定义神经网络.计算损失和更新网络中的权重. 关于数据 通常来讲,当你开始处理图像.文字.音频和视频数据,你可以使用 Python 的标准库加载数据进入 Num ...
- ts类与修饰符
最近在用egret做游戏,就接触到了ts,刚开始的时候觉得类挺难的,毕竟大多数的JavaScript工程师工作中不怎么需要用到这个,但是学起来就不愿意撒手了,真香! typescript其实是es6的 ...