主题:数组基础部分
数组基础复盘
数组基本操作机器使用:完整的java数组操作应用知识汇总_w3cschool
刷题:
977.有序数组的平方
图文讲解
视频讲解
题目及个人题解
//方法一:暴力破解
public int[] sortedSquares(int[] nums) {
//思路 先将nums的数据的绝对值平方 放入一个数组 最后在经过排序即可
int[] res=new int [nums.length];
for(int i=0;i<nums.length;i++){
res[i]=Math.abs(nums[i])*Math.abs(nums[i]);
}
Arrays.sort(res);
return res;
}
//暴力破解的时间复杂度为nlogn;
//方法二:双指针 时间复杂度为n
//思路是 左右两个指针 l r 如果左边平方大于右边,左边值存入对应的数组中的末尾j,反之右边平方数存入所剩末尾。
public int[] sortedSquares(int[] nums) {
int l = 0;
int r = nums.length - 1;
int[] res = new int[nums.length];
int j = nums.length - 1;
while(l <= r){
if(nums[l] * nums[l] > nums[r] * nums[r]){
res[j--] = nums[l] * nums[l++];
}else{
res[j--] = nums[r] * nums[r--];
}
}
return res;
}
个人总结
暴力解法:所有数字平方后排序
双指针:有序数组,比较每个数平方之间的大小,根据大小放入对应的位置
要学会熟练使用双指针,熟悉其使用场景(比如有序情况下)。
209.长度最小的子数组
图文讲解
视频讲解
题目及个人题解
//方法一:滑动窗口
public int minSubArrayLen(int target, int[] nums) {
// 思路 是用双指针来判断连续数据是否等于target(滑动窗口)
// 用sum统计连续数据间的和 result表示其长度
int left = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= target) {
result = Math.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
//方法二:暴力破解 采用两个for循环,i j 每一次循环启示位置为i j为结束位置
//偷懒一下,就不写了
个人总结
滑动窗口是基于双指针来实现,left为起点,right为终点,一般是起点不动,终点动,直到满足条件或结束,下一步,起点动,终点先不动,循环以往,实现一个大小可以改变的滑动的窗口。
本体来讲:窗口就是满足其和 ≥ target的长度最小的连续子数组
时间复杂度:O(n):主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)(该部分摘自代码随想录)
59.螺旋矩阵II
图文讲解
视频讲解
题目及个人题解
//考点模拟过程
public int[][] generateMatrix(int n) {
//思路:将每次环绕分为四部分 上:左至右 右:上至下 下:右至左 左:下至上
int[][] res=new int[n][n];
int h=0;
int l=0;
int nums=1;
while (nums<n*n){
//上:左至右
for (int i=l;i<n-l-1;i++){
res[h][i]=nums++;
}
//右:上至下
for(int j=h;j<n-h-1;j++){
res[j][n-l-1]=nums++;
}
//下:右至左
for(int k=n-l-1;k>l;k--){
res[n-h-1][k]=nums++;
}
//左:下至上
for(int z=n-h-1;z>h;z--){
res[z][l]=nums++;
}
h++;
l++;
}
//如果为奇数,需要单独给中间模块赋值
if(n%2!=0) res[n/2][n/2]=n*n;
return res;
}
个人总结
模拟过程就是要找到过程中的核心,也就是不变量,本题的不变量是画圈,从外到内:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
个人鸡汤
有心者无意,无心者有意。