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

做网站好用的cms潍坊网站建设

做网站好用的cms,潍坊网站建设,搬瓦工装WordPress,qq刷赞网站怎么做的算法题 Leetcode 1005.K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和 大佬视频讲解:K次取反后最大化的数组和视频讲解 个人思路 思路清晰,因为是取反当然是取越小的负数越好,那么先按绝对值排序。如果是负数就取反&#…

 算法题

Leetcode 1005.K次取反后最大化的数组和

题目链接:1005.K次取反后最大化的数组和

 大佬视频讲解:K次取反后最大化的数组和视频讲解

 个人思路

思路清晰,因为是取反当然是取越小的负数越好,那么先按绝对值排序。如果是负数就取反,相应取反次数减一,遍历到没有负数后还有取反次数就选绝对值最小的值取反剩下的次数,最后数组和就是最大的,也是局部最优求全局最优的结果,可以用贪心

解法
贪心法

按照贪心法的步骤来解题,步骤为:

  • 第一步:将数组按照绝对值大小从大到小排序
  • 第二步:从前向后遍历,遇到负数将其变为正数,同时K--
  • 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
  • 第四步:求和

class Solution {public int largestSumAfterKNegations(int[] nums, int K) {nums = IntStream.of(nums) //创建了一个原始类型 int 的流.boxed()//将流中的int值装箱成Integer对象.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))//按绝对值大小排序.mapToInt(Integer::intValue).toArray();//转回int[] 类型的数组int len = nums.length;	    for (int i = 0; i < len; i++) {//从前向后遍历,遇到负数将其变为正数,同时K--if (nums[i] < 0 && K > 0) {nums[i] = -nums[i];K--;}}// 如果K还大于0,那么反复转变数值最小的元素,将K用完if (K % 2 == 1) nums[len - 1] = -nums[len - 1];return Arrays.stream(nums).sum();}
}

时间复杂度:O(n log n);(排序操作的时间复杂度是 n log n)

空间复杂度:O(n);(代码使用了额外的数组来存储排序后的结果)


 Leetcode  134. 加油站

题目链接:134. 加油站

大佬视频讲解:加油站视频讲解

个人思路

首先总油量减去总消耗大于等于零那么一定可以跑完一圈,找起点就从头遍历,油减油耗如果有负数就当前遍历点加1,重新计算,直到遍历完总油耗还是大于0;

解法
贪心法

首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,也就是各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。

每个加油站的剩余量rest[i]为gas[i] - cost[i]。

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum,i+1后面如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了

局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置。局部推全部,贪心!

class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int curSum = 0;//当前油耗int totalSum = 0;//全部油耗int index = 0;//起点for (int i = 0; i < gas.length; i++) {curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];if (curSum < 0) {index = (i + 1) % gas.length ; //更换新起点curSum = 0;}}if (totalSum < 0) return -1;return index;}
}

时间复杂度:O(n);(遍历整个数组)

空间复杂度:O(1);(常量级的变量)


 Leetcode  135. 分发糖果

题目链接:135. 分发糖果

大佬视频讲解:分发糖果视频讲解

 个人思路

到底是一起算还是分开计算呢?思路不清晰...

解法
贪心法

这道题目一定是要确定一边之后,再确定另一边,先比较每一个孩子的左边,然后再比较右边如果两边一起考虑一定会顾此失彼

先确定右边评分大于左边的情况,比较左孩子(从前向后遍历),确定分发糖果的第一个数组

再确定左孩子大于右孩子的情况,比较右孩子(从后向前遍历),对前一个数组优化,比较右孩子增加糖果的同时也要比交上一个数组的糖果值,二者取最大的.

具象化代码步骤就是分两个阶段
         1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
         2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大

class Solution {public int candy(int[] ratings) {int len = ratings.length;int[] candyNums = new int[len];candyNums[0] = 1;//初始化第一个孩子糖果数for (int i = 1; i < len; i++) {//从左往右,比左孩子candyNums[i] = (ratings[i] > ratings[i - 1]) ? candyNums[i - 1] + 1 : 1;}for (int i = len - 2; i >= 0; i--) {//从右往左,比右孩子if (ratings[i] > ratings[i + 1]) {candyNums[i] = Math.max(candyNums[i], candyNums[i + 1] + 1);//取最大糖果数}}int ans = 0;for (int num : candyNums) {//累加和ans += num;}return ans;}
}

时间复杂度:O(n);(遍历两遍整个数组)

空间复杂度:O(n);(暂存数组大小)


 以上是个人的思考反思与总结,若只想根据系列题刷,参考卡哥的网址代码随想录算法官网

http://www.ds6.com.cn/news/119884.html

相关文章:

  • 如何下载字体到wordpress网站快照优化公司
  • 免费网站免费进入在线海南百度推广公司
  • 做一个15页的网站怎么做关键词快速上首页排名
  • 哪个网站做外贸假发好山东自助seo建站
  • html网页制作免费模板下载医疗网站优化公司
  • 郴州网站seo武汉网站推广
  • 做网站的商标是哪类克州seo整站排名
  • 建网站如何备案企业如何进行品牌推广
  • 代码重构网站天津seo排名
  • 国内网站域名好的竞价托管公司
  • 怎么帮客户做网站建站关键词优化
  • 查看网站是用什么做的无货源网店怎么开
  • 对网站建设好学吗搜索引擎哪个好
  • 长春 行业网站网络推广营销方案免费
  • vs做asp网站流程最好的推广平台是什么软件
  • 微信web开发者工具seo分析案例
  • 宣城市建设银行网站外包公司什么意思
  • 网站做聚合是啥意思武汉搜索推广
  • 西安建设教育网站安徽网络seo
  • 网站不能自行备案吗优化推广
  • php网站后台忘记密码网站优化排名查询
  • 万盛网站建设深度搜索
  • 企业网站建设安阳关键词工具网站
  • ftp上传php网站seo优化快排
  • 网站定制开发合同深圳高端网站制作公司
  • 四海网络网站建设建站郑州优化公司有哪些
  • 上海专业做网站网络营销的主要特点有哪些
  • 西乡做网站费用产品营销方案案例范文
  • 做集装箱的网站每天三分钟新闻天下事
  • 手机如何建设网站各种网站