草庐IT

代码随想录训练营第二天 | 977.有序数组的平方、209.长度最小的子数组 、59.螺旋矩阵II

觅渡子 2024-04-25 原文

977 有序数组的平方

题目

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序

977. 有序数组的平方

思路

找到分段点,然后双有序数组插入新数组(i++,j--这样遍历)

代码

 class Solution {
     public int[] sortedSquares(int[] nums) {
         int len = nums.length;
         if (len == 0) return nums; // 空集直接结束
         int[] neg = new int[len];
         int[] pos = new int[len];
         int[] ans = new int[len];
         int i = 0;
         for (; i < len ; i++ ){            
             if ( nums[i] > 0) break;
             neg[i] = nums[i] * nums[i];
         }
         int j = i - 1 ; //现在j为neg指针, i为正数pos指针
         while ( i < len){
             pos[i] = nums[i] * nums[i];
             i++;
         }
         i = j + 1;
         for (int k = 0 ; k < len ; k++){
             if ( j < 0 ){
                 while ( k <len ){
                     ans[k++]=pos[i++];
                 }
                 break;
             }
             if ( i == len ){
                 while ( k <len ){
                     ans[k++]=neg[j--];
                 }
                 break;
             }
             if (neg[j] > pos[i]){
                 ans[k] = pos[i];
                 i++;
             }else{
                 ans[k] = neg[j];
                 j--;
             }
         }
         return ans;
     }
 }

过程

纠结 如何找到分段点,先遍历一遍找到分段点再平方 还是 边平方边找分段点

判断空集与 单元素集也恼火

然后是 不找中间,直接两边 往中间找 这样呢?

想到 分段点 如果 -3 的绝对值 最小 ,那他是正的还是负的都无所谓

执行中

  1. 创建数组语法错误 int[] neg = new int[len]

  2. 写备注忘了打分号

  3. 第一轮,i 值用来遍历了,导致 i 满了,应重新赋值

  4. [0] 又出问题了。。 发现是 正数数组 ,判定有问题

总结

双有序插入新的 就是归并排序。。。。

209 长度最小的子数组

题目

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

链接:#209 长度最小的子数组

思路

之前好像摸过

  1. 找到第一组,即从第一个元素开始的ans[],并记录头尾指针与length,front and rear

  2. front ++ ,比较大小,若仍大于,length--,重复2;若小于,转3 PS:由于 第一步 中,是从左开始找的,所以从左边开始删没啥问题

  3. front 与 rear 同时 +1,比较大小,若大于,转2;若小于,重复3。 直到rear大于n

代码

 class Solution {
     public int minSubArrayLen(int target, int[] nums) {
         int length = 0;
         int front = 0;
         int rear = 0;
         int i = 0;
         int sum = 0 ;
         while(rear < nums.length){
             sum += nums[rear];
             if(sum >= target){
                 length = rear  - front + 1;
                 break;
             }
             ++rear;
         }
         while(rear < nums.length){
             if(sum >= target){
                 length = rear  - front + 1;
                 sum -= nums[front++];
             }
             if(sum < target){
                 ++rear;
                 if (rear == nums.length)break;
                 sum += nums[rear];
                 sum -= nums[front++];
             }
         }
         return length;
     }
 }

过程

错误

  1. 第二三步忘了修改sum值

  2. sum -= nums[++rear],在最后一步会因为++rear超限而报错。 想优美一点,sum没有每次循环都重新计算,而是 +1 -1 修改方法也不优美,还要每次循环都再判断 rear == nums.length ,显得循环条件没用 emmm看看题解吧

  3. front = rear ,即单元素成立时, sum -= nums[front++]; 超限 解决办法将该步放在新增的 判断条件后

题解笔记

总结

59 螺旋矩阵Ⅱ

题目

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

#59 螺旋矩阵 II

思路

绕圈,一圈四边,每边为边长-1, 注意最后一圈,若为奇数,需单独讨论

代码

 class Solution {
     public int[][] generateMatrix(int n) {
         int[][] ans = new int[n][n];
         int i = 0;
         int j = 0;
         int cir = 0;
         int count = 0;
         int left,right;
         int slen = n - 1; //slen:边长-1
         for(  ; cir < n/2 ; cir++){
             left = cir ;
             right = n - cir - 1;
             for( ; j < right ; ++j){
                 ans[i][j] = ++count ; 
             }
             for( ; i < right ; ++i){
                 ans[i][j] = ++count ; 
             } 
             for( ; j > left ; --j){
                 ans[i][j] = ++count ; 
             }
             for( ; i > left ; --i){
                 ans[i][j] = ++count ; 
             }
             ++i;
             ++j;
         }
         if( n % 2 == 1)ans[n/2][n/2]=++count;
         return ans;
     }
 }

过程

简单题

过程错误

每一圈结束是回到起点,需要额外 ++i 和 ++j

题解笔记

没看懂那个根据方向模拟的

日记

emmm又是摆烂的一天,题解又没看完,时间一会就没了

昨晚睡不着,4点才睡,早上11点起来,玩会手机没了。
中午取个快递,把家里的体重秤上了电池,已经175斤了,该减肥了。玩会手机又两点半了。
然后午觉又睡不着。4点过又被叫起来。。弄了下锻炼,因为没睡好,感觉不适,睡眠还要调整。
6点开始做随想录,还是边玩边做
7点过吃饭,就拖个地弄弄了下小零件,一看时间 ,捏麻9点了,人都麻了。
然后做回题洗澡去,再然后就是现在写总结了

简单规划一下

午睡与晚睡看正念冥想入睡,md那个若灵心理的冥想课要捏麻599,忒贵了,咱代买随想录刷题班才一半的钱,这几天先听听试听。
午觉起来运动。

争取24点睡,9点起。1330睡午觉
其他时间学习,javase 和算法

有关代码随想录训练营第二天 | 977.有序数组的平方、209.长度最小的子数组 、59.螺旋矩阵II的更多相关文章

  1. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  5. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  9. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  10. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

随机推荐