之前看过几天,但当时随着一些事情就放下了,最近想着要去找实习,打算捡起来,还在犹豫报不报训练营,感觉整天忙,有感觉有时间...
言归正传,今天看了数组,这个c以前就学过,就是一个空间,数组名代表数组的首地址,在c++是连续的地址,但在java不是(输出地址无规律)
写二分法的时候发现自己一直在写判断语句,但是不知道怎么能实现一个循环判断的功能,感觉也能用for,但是不知道怎么循环,没写,改天可以试下。
发现自己在用while 和if总是纠结,开头的整体区间,想着用if,但if执行的话只能执行一次,执行完成就跳出了,但是可能与一次的if并不能判断出,因此需要循环判断while。
主要对while理解有问题,理解while的循环过程。感觉需要注意的是target值在数组中存在这个条件 2024.3.13记。
隔了几天又来了,重新做了二分法,发现区间的开闭会影响while的判断左闭右开,右边的开区间的数其实应该大于总数,因为取不到。而right作为数组的下标,因为下标从0开始,因此数组最大的下标数为right=nums.size()-1而如果为开区间应+1。
删除元素:
暴力,遍历数组,当元素等于时赋值进行覆盖,但是要注意内循环的j如果是j<n判断时,如果用j+1,则超出数组范围。因此要用nums[j-1]=nums[j],而应该改变的值是i,即i=j-1,j=i+1。
当将下一个值赋给第i位,执行完成外循环会导致i+1,但是此时的i位是以前的i+1,因此还需要判断此时的i,因此为了抵消i+1,执行i--,
快慢指针法:快指针用来遍历整个数组,,慢指针对不需要删除的元素进行计数,注意slow++的位置(先将当前值保留,然后更改slow),注意在元素不需要删除时才slow++。
2024.3.16 没弄完,18弄。
数组平方排序,直接对数组平方,注意需要遍历所有元素,n<nums.size(),不-1,
排序,sort(nums.begin(),nums.end());
忘记了各种排序法,依次对比使用的选择排序法;冒泡排序,大的右移。
3.24
长度最小的子数组。暴力
注意题目要求的是找出数组中的连续子数组>target,这个连续再这里降低了难度,否则会出现第一个元素与最后一个元素组成的子数组,子数组的可能性变多。
通过两层循环解决,一层先找子数组的第一个元素(连续),找子数组不同首元素的最短子数组,找到第一个子数组后即跳出循环,因为后续长度只会增加,不是最短长度。
代码随想录的是再内循环中对sum进行更新,令j=i,这样在内循环实现了sum的更新。
也可以在外循环更新一次sum = nums[i],此时需要注意的是内循环是外循环这一层没有满足>条件下进行的,所以需要在外循环直接判断,如果满足则更新result。
双指针法:感觉实际上还是双循环,先确定终止位置,然后通过while(sum>=target),遍历所有>=的子数组,随着起始点的增加,随之减小sublength=j-i+1,感觉其中这个sum=sum-nums[i++]有循环的感觉。
螺旋矩阵,首先创建n维矩阵,vector<vector<int>> res(n,vector<int>(n,0)); 动态数组
不确定一般的创建数组行不? 通过输入值n确定数组维度
一般需要确定数组大小,动态数组可以在运行时确定数组的大小。
大致思路即保证每个边的遍历规则保持一致,此处是左闭右开
while的判断条件,一共旋转几圈,一整圈即占用两行两列,即总圈数为n/2(偶数),注意n为奇数,中间保留一个值,需要手动赋值。
在执行完循环后需要对起始以及边界条件进行更改。如startx++
不明白为什么奇数时res[mid][mid] = count;是上边已经加到了?
答:res[i][j] = count++ 先赋值再自增。
3.26