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

中国著名的做网站渗透设计规范网站

中国著名的做网站渗透,设计规范网站,长春网页制作建站,软件下载文章目录 1005.K次取反后最大化的数组和思路分析代码实现 134. 加油站暴力方法贪心方法 135. 分发糖果(处理一边再处理一边)思路分析代码实现思考总结 1005.K次取反后最大化的数组和 题目链接#x1f525; 给定一个整数数组 A#xff0c;我们只能用以下方法修改该数组#… 文章目录 1005.K次取反后最大化的数组和思路分析代码实现 134. 加油站暴力方法贪心方法 135. 分发糖果(处理一边再处理一边)思路分析代码实现思考总结 1005.K次取反后最大化的数组和 题目链接 给定一个整数数组 A我们只能用以下方法修改该数组我们选择某个索引 i 并将 A[i] 替换为 -A[i]然后总共重复这个过程 K 次。我们可以多次选择同一个索引 i。 以这种方式修改数组后返回数组可能的最大和。 示例 1 输入A [4,2,3], K 1 输出5 解释选择索引 (1,) 然后 A 变为 [4,-2,3]。 示例 2 输入A [3,-1,0,2], K 3 输出6 解释选择索引 (1, 2, 2) 然后 A 变为 [3,1,0,2]。 示例 3 输入A [2,-3,-1,5,-4], K 2 输出13 解释选择索引 (1, 4) 然后 A 变为 [2,3,-1,5,4]。 提示 1 A.length 10000 1 K 10000 -100 A[i] 100 思路分析 局部最优让绝对值大的负数变为正数当前数值达到最大整体最优整个数组和达到最大。 局部最优可以推出全局最优。 那么如果将负数都转变为正数了K依然大于0此时的问题是一个有序正整数序列如何转变K次正负让 数组和 达到最大。 那么又是一个贪心 局部最优只找数值最小的正整数进行反转当前数值和可以达到最大例如正整数数组{5, 3, 1}反转1 得到-1 比 反转5得到的-5 大多了 全局最优整个 数组和 达到最大。 那么本题的解题步骤为 第一步将数组按照绝对值大小从大到小排序注意要按照绝对值的大小第二步从前向后遍历遇到负数将其变为正数同时K–第三步如果K还大于0那么反复转变数值最小的元素将K用完第四步求和 代码实现 class Solution { public:static bool compare(int a,int b){return(abs(a)abs(b));}int largestSumAfterKNegations(vectorint nums, int k) {sort(nums.begin(),nums.end(),compare);for(int i0;inums.size()k0;i){if(nums[i]0){nums[i]*-1;k--;}}if(k%21) nums[nums.size()-1]*-1;int result0;for(int i0;inums.size();i) {coutnums[i];resultnums[i];}return result;} };记录一个错误 第一次写成这样了 class Solution { public:bool compare(int a,int b){//注意这里return(abs(a)abs(b));}int largestSumAfterKNegations(vectorint nums, int k) {sort(nums.begin(),nums.end(),compare);...} };就报错了这是因为compare 函数是一个非静态成员函数这意味着它与类的实例相关联。然而在调用 sort 函数时它期望一个普通的非成员函数比较器。 两种可能的方法 方法 1将 compare 定义为静态成员函数 class Solution { public:static bool compare(int a, int b) {return (abs(a) abs(b));}int largestSumAfterKNegations(vectorint nums, int k) {sort(nums.begin(), nums.end(), compare);// 其他部分保持不变} };方法 2将 compare 定义在类的外部 bool compare(int a, int b) {return (abs(a) abs(b)); }class Solution { public:int largestSumAfterKNegations(vectorint nums, int k) {sort(nums.begin(), nums.end(), compare);// 其他部分保持不变} };这两种方法都将 compare 函数与类的实例无关从而可以在 sort 函数中正常使用。 134. 加油站 题目链接 在一条环路上有 N 个加油站其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发开始时油箱为空。 如果你可以绕环路行驶一周则返回出发时加油站的编号否则返回 -1。 说明: 如果题目有解该答案即为唯一答案。 输入数组均为非空数组且长度相同。 输入数组中的元素均为非负数。 示例 1: 输入: gas [1,2,3,4,5] cost [3,4,5,1,2] 输出: 3 解释: 从 3 号加油站(索引为 3 处)出发可获得 4 升汽油。此时油箱有 0 4 4 升汽油开往 4 号加油站此时油箱有 4 - 1 5 8 升汽油开往 0 号加油站此时油箱有 8 - 2 1 7 升汽油开往 1 号加油站此时油箱有 7 - 3 2 6 升汽油开往 2 号加油站此时油箱有 6 - 4 3 5 升汽油开往 3 号加油站你需要消耗 5 升汽油正好足够你返回到 3 号加油站。因此3 可为起始索引。 示例 2: 输入: gas [2,3,4] cost [3,4,3] 输出: -1 解释: 你不能从 0 号或 1 号加油站出发因为没有足够的汽油可以让你行驶到下一个加油站。我们从 2 号加油站出发可以获得 4 升汽油。 此时油箱有 0 4 4 升汽油。开往 0 号加油站此时油箱有 4 - 3 2 3 升汽油。开往 1 号加油站此时油箱有 3 - 3 3 3 升汽油。你无法返回 2 号加油站因为返程需要消耗 4 升汽油但是你的油箱只有 3 升汽油。因此无论怎样你都不可能绕环路行驶一周。 暴力方法 暴力的方法很明显就是O(n^2)的遍历每一个加油站为起点的情况模拟一圈。 如果跑了一圈中途没有断油而且最后油量大于等于0说明这个起点是ok的。 暴力的方法思路比较简单但代码写起来也不是很容易关键是要模拟跑一圈的过程。 for循环适合模拟从头到尾的遍历而while循环适合模拟环形遍历要善于使用while C代码如下 class Solution { public:int canCompleteCircuit(vectorint gas, vectorint cost) {for (int i 0; i cost.size(); i) {int rest gas[i] - cost[i]; // 记录剩余油量int index (i 1) % cost.size();while (rest 0 index ! i) { // 模拟以i为起点行驶一圈如果有rest0那么答案就不唯一了rest gas[index] - cost[index];index (index 1) % cost.size();}// 如果以i为起点跑一圈剩余油量0返回该起始位置if (rest 0 index i) return i;}return -1;} };贪心方法 如果总油量减去总消耗大于等于零那么一定可以跑完一圈说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 i从0开始累加rest[i]和记为curSum一旦curSum小于零说明[0, i]区间都不能作为起始位置因为这个区间选择任何一个位置作为起点到i这里都会断油那么起始位置从i1算起再从0计算curSum。 如图 那么为什么一旦[0i] 区间和为负数起始位置就可以是i1呢i1后面就不会出现更大的负数 如果出现更大的负数就是更新i那么起始位置又变成新的i1了。 那有没有可能 [0i] 区间 选某一个作为起点累加到 i这里 curSum是不会小于零呢 如图 如果 curSum0 说明 区间和1 区间和2 0 那么 假设从上图中的位置开始计数curSum不会小于0的话就是 区间和20。 区间和1 区间和2 0 同时 区间和20只能说明区间和1 0 那么就会从假设的箭头初就开始从新选择其实位置了。 那么局部最优当前累加rest[i]的和curSum一旦小于0起始位置至少要是i1因为从i之前开始一定不行。全局最优找到可以跑一圈的起始位置。 局部最优可以推出全局最优找不出反例试试贪心 整体代码 class Solution { public:int canCompleteCircuit(vectorint gas, vectorint cost) {int curSum0;int totalSum0;int startIndex0;for(int i0;igas.size();i){curSumgas[i]-cost[i];totalSumgas[i]-cost[i];if(curSum0) { // 当前累加rest[i]和 curSum一旦小于0curSum0; // 起始位置更新为i1startIndexi1; // curSum从0开始 }}if(totalSum0) return -1; // 说明怎么走都不可能跑一圈了return startIndex;} };135. 分发糖果(处理一边再处理一边) 题目链接 老师想给孩子们分发糖果有 N 个孩子站成了一条直线老师会根据每个孩子的表现预先给他们评分。 你需要按照以下要求帮助老师给这些孩子分发糖果 每个孩子至少分配到 1 个糖果。相邻的孩子中评分高的孩子必须获得更多的糖果。 那么这样下来老师至少需要准备多少颗糖果呢 示例 1: 输入: [1,0,2] 输出: 5 解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。 示例 2: 输入: [1,2,2] 输出: 4 解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果这已满足上述两个条件。 思路分析 这道题目一定是要确定一边之后再确定另一边例如比较每一个孩子的左边然后再比较右边如果两边一起考虑一定会顾此失彼。 先确定右边评分大于左边的情况也就是从前向后遍历 此时局部最优只要右边评分比左边大右边的孩子就多一个糖果全局最优相邻的孩子中评分高的右孩子获得比左边孩子更多的糖果 局部最优可以推出全局最优。 如果ratings[i] ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个所以贪心candyVec[i] candyVec[i - 1] 1 // 从前向后 for (int i 1; i ratings.size(); i) {if (ratings[i] ratings[i - 1]) candyVec[i] candyVec[i - 1] 1; }再确定左孩子大于右孩子的情况从后向前遍历 遍历顺序这里有同学可能会有疑问为什么不能从前向后遍历呢 因为 rating[5]与rating[4]的比较 要利用上 rating[5]与rating[6]的比较结果所以 要从后向前遍历。 如果从前向后遍历rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了 。如图 所以确定左孩子大于右孩子的情况一定要从后向前遍历 如果 ratings[i] ratings[i 1]此时candyVec[i]第i个小孩的糖果数量就有两个选择了一个是candyVec[i 1] 1从右边这个加1得到的糖果数量一个是candyVec[i]之前比较右孩子大于左孩子得到的糖果数量。 那么又要贪心了局部最优取candyVec[i 1] 1 和 candyVec[i] 最大的糖果数量保证第i个小孩的糖果数量既大于左边的也大于右边的。全局最优相邻的孩子中评分高的孩子获得更多的糖果。 局部最优可以推出全局最优。 所以就取candyVec[i 1] 1 和 candyVec[i] 最大的糖果数量candyVec[i]只有取最大的才能既保持对左边candyVec[i - 1]的糖果多也比右边candyVec[i 1]的糖果多。 // 从后向前 for (int i ratings.size() - 2; i 0; i--) {if (ratings[i] ratings[i 1] ) {candyVec[i] max(candyVec[i], candyVec[i 1] 1);} }代码实现 class Solution { public:int candy(vectorint ratings) {int result0;vectorint candy(ratings.size(),1);for(int i1;iratings.size();i){if(ratings[i]ratings[i-1]) candy[i]candy[i-1]1;}for(int iratings.size()-1;i0;i--){if(ratings[i]ratings[i-1]) candy[i-1]max(candy[i]1,candy[i-1]);}for(int candy:candy){resultcandy;}return result;} };思考总结 本题涉及到一个思想就是想处理好一边再处理另一边不要两边想着一起兼顾 采用了两次贪心的策略 一次是从左到右遍历只比较右边孩子评分比左边大的情况。一次是从右到左遍历只比较左边孩子评分比右边大的情况。
http://www.w-s-a.com/news/10822/

相关文章:

  • 公司网站备案多少钱推特最新消息今天
  • 网站关键词设置代码seo搜索优化 指数
  • 做网站卖东西送上门做暧暧xoxo网站
  • 网站网站设计公司网站维护运营好做吗
  • 照片做成视频的软件seo两个域名一个网站有影响吗
  • 制作动画的网站河南省住房城乡建设门户网站
  • 网站推广原则做网站的那个语言好
  • 潍坊网站建设怎样商品网站建设设计思路
  • 建网站公司是如何赚钱南昌营销网站公司哪家好
  • 淘宝客网站管理质量好网站建设费用
  • 网站建设教程搭建青岛中企动力做网站怎么样
  • wordpress最底部网站优化怎么弄
  • 二手市场网站建设的目的长沙ui设计公司
  • 微信公众号做留言网站wordpress详情页选择模板
  • php网站开发面向对象教程如何做分享赚钱的网站
  • 山东网站建设最便宜常州网站建站公司
  • 网站地图 seo中国建设招标网是私人网站吗
  • 高中作文网站全网营销有哪些平台
  • 网站构建建设制作平台上海搬家公司收费价目表
  • 成功案例展示网站做网站赚多少钱
  • 建设银行网站用什么字体网站建站后维护需要做哪些
  • 有哪些做平面设计好素材网站有哪些开网站建设
  • 国际交流网站平台有哪些筑建网
  • 网站程序是如何开发的江门市住房建设管理局网站
  • 网站建设一般需要几个步骤昵图网免费素材
  • 个人网站建设需求说明书微信域名防封在线生成
  • 专业网站建设的公司wordpress后台没有模板
  • 哈尔滨网站运营服务商制作外贸网站公司
  • 个人网站需要备案宁波网站推广工具
  • 苏州建设银行网站首页wordpress修改密码