花了三天才把数组部分刷完,收获很大!还有好多点需要复盘,下周!
二分法
-
左闭右闭[left,right] while(left< = right) 左右相等是有意义的 如果mid>target, mid=right-1; 如果mid<target, mid=left+1;
-
左闭右开[left,right) while(lefttarget, mid=right; 如果mid<target, mid=left+1;
移除元素
-
暴力解法 两个for循环,第一遍找出元素,第二遍数组更新
-
双指针解法(快慢指针) 慢指针遍历,快指针没有遇到指定元素,就跟随满指针一起往后走;遇到指定元素,就不动
有序数组的平方
我的思路:类似于冒泡排序
-
暴力排序 C#.NET中ToArray 将IEnumerable转换为数组 Select 是LINQ中的一种投影操作方法 | 把原数组的元素按照你的要求变成新内容 return (nums.Select(x=>x*x).OrderBy(x=>x).ToArray());
-
双指针 思路:因为是非递减的数组,所以最大的平方数一定出现在最前面或最后面 新建一个长度大小相同的数组,前后各一个指针,不断比较,较大的移到后面的指针
长度最小的子数组
采用滑动窗口 思路:
-
确定滑动窗口起始值、滑动窗口总和、滑动窗口大小值
-
滑动终止值不断后移遍历,如果遇到总和比目标总和大,滑动窗口开始值向后移
-
总而言之,比目标总和大,开始值后移;比目标总和小,终止值后移
螺旋数组||
思路:全程采用左闭右开原则
-
左到右→上到下→右到左→下到上 循环到结束为止
-
需要确定一共走多少圈、每1/4圈走多少格,每一大圈起始位置xy的坐标,设置变量
-
需要定义的变量: offset:记录当前圈数与n的差值,用于确定边界 loop:需要循环的圈数 startx/starty:每循环一个圈的起始位置
区间和
思路:
构建前缀和数组prefixsum 对于[a,b]区间内的总和,可以用计算式:sum(a,b)=prefixsum[b+1]-prefixsum[a];
Java读数的写法 Java
nextInt():读取一个整数
hasNext() :检查输入中是否还有下一个值可以读取
-
读取数组长度
-
读取数组元素
-
构建前缀和数组,prefixsum记录截至每个当前数的所有前数总和
-
持续读取 a,b 区间并输出对应的区间和
开发商购买土地
二维前缀和 思路:
-
输入数组
-
构建二维前缀和,确定总的总和
-
横向切割,获取上面部分总和,最后算出上下两部分的差值并比较
-
纵向切割,获取下面部分总和,最后算出上下两部分的差值并比较
-
输出结果
前缀和:
一维前缀和的核心公式:pre[i+1] = pre[i] + a[i];
二维前缀和的核心公式:pre[i+1][j+1] = pre[i][j+1] + pre[i+1][j] - pre[i][j] + grid[i][j];