2024.7.12 刷题总结

2024-07-12 1305阅读

2024.7.12

2024.7.12 刷题总结
(图片来源网络,侵删)

**每日一题**

2974.最小数字游戏,这道题是一个简单模拟题,我们只需要根据题意完成即可,题目的意思是每次从数组中选出最小的两个元素,然后先放入第二小的,再放最小的,所以我们只需要先对数组排序,然后再依次取出两个元素放进去即可。

457.环形数组是否存在循环,这道题是一个考察快慢指针的题目,将数组中的n个点看作图中的n个节点,再将i+nums[i]看作每个节点延伸出去的单向边,所以现在题目变成判断有无环路的题目,这时我们就可以遍历数组,初始化快慢指针,快指针在慢指针前面一步,然后每次快指针走两步,慢指针走一步,直到他们相遇。我用的并不是这种方法,而是通过一直根据规则往前遍历来寻找,其实是一个暴力做法,但是可以根据题目条件进行剪枝,首先题目说了满足条件的数组元素要么全正要么全负,那么我们可以标记第一个元素的正负,如果后面出现符号不同的元素就直接退出。还需要标记一个已经走的步数,最后判断答案时,步数需要大于1才是有效的答案,并且在走的过程中,需要设置步数大于一定值自动退出,否则会出现runtime error.

class Solution {public :
    bool circularArrayLoop(vector & nums) {
         bool flag = false;
         int n = nums.size();
         if (n == 1) return false;
         int f = 0;
         int cnt = 0;
         int len = 0;
         for (int i = 0; i  0) f = 1;
                 else  f = 0;
                 len = 0;
                 if (f == 1) {
                         cnt = (i + nums[i]) % n;
                         len++;
                         while (cnt != i) {
                                 if (nums[cnt] 1000) break;
                                 else{
                                      cnt = (cnt + nums[cnt]) % n;
                                      len++;
            }
                             
        }
                         if (cnt == i && len > 1) flag = true;
                     
    }
                 else {
                         if (i + nums[i] >= 0) cnt = (i + nums[i])%n;
                         else {
                         int a=i+nums[i];
                         while (a 0) break;
                               if(len>1000) break;
                               else {
                                     if (cnt + nums[cnt] >= 0) cnt =
                    (cnt + nums[cnt])%n;
                                     else {
                                  int c = cnt + nums[cnt];
                                  while(c 1) flag = true;
}
             
    
}return flag;
}
};

42.接雨水,这道题是一个经典的动态规划问题,根据题意可以有很多种解题方法,可以按行也可以按列来求解,这里我们选用的是按列来求解。

每一列能接到的雨水取决于左右两侧的高度最大值的更小值和自身的高度,所以我们从前往后和从后往前遍历两次数组,分别处理出每列的左边最大值和右边最大值。然后我们再遍历数组加上答案即可。注意最大值数组需要初始化第一个和最后一个,更新最大值公式应该是用前一个值来更新,因为当前还没有数值。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]