题目链接:leetcode
已知条件:已经提供好的升序数组
思路:双指针法
①双指针法 典型的用空间换时间
②因为绝对值最大的元素只能出现在数组两侧,所以设置两个指针分别指向数组两侧,通过比较其平方的大小,将平方值大的元素放在新数组的末位置,这样达到目的
public static int[] sortedSquares(int[] nums) {
int[] result = new int[nums.length];//申请n个空间的结果集存放数据,从大到小存放数据
int left,right;
left = 0;
right = nums.length - 1;
int index = nums.length - 1;
//双指针设置while循环
while(left <= right){
if(nums[left] * nums[left] <= nums[right] * nums[right]){
// result[nums.length - 1 - i] = nums[right] * nums[right];
result[index--] = nums[right] * nums[right];
right--;
}else{
result[index--] = nums[left] * nums[left];
left++;
}
}
return result;
}
题目链接:leetcode
感受:仍需加强理解啊!!!
//滑动窗口==>双指针 一个for循环代替两个for循环事情
//关键点1: j代表终止位置,一个个向后移动
// 当发现集合中的元素和大于给定值,移动起始位置
//关键点2:从起始位置开始缩小长度
//关键点3:在经历了一次滑动窗口后,起始位置的位置不用动
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int left = 0;
int sum = 0;
for(int right = 0;right < nums.length;right++){
sum += nums[right];
while(sum >= target){//大于等于,判断0情况
result = Math.min(result, right - left + 1);
sum -= nums[left];
left++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;//最后一步做判断是否有符合条件的长度
}
题目链接:leetcode
//关键变量:1.每次循环出发点start 2.转几圈 3.每次填充的数字 4.遍历的变量i,j
public int[][] generateMatrix(int n) {
int start = 0;
int loop = 0;//从零开始
int count = 1;
int[][] arr = new int[n][n];
int i = 0,j = 0;//列行变量
while(loop < n / 2){
// 判断边界后,loop从1开始
loop++;
for(j = start;j < n - loop;j++){
//这必须从start开始,因为最后执行i的话会到第一行
arr[start][j] = count++;
}
for(i = start;i < n -loop;i++){
arr[i][j] = count++;
}
//i,j初始值都已经用过了,所以不用再用
for(;j >= loop;j--){
arr[i][j] = count++;
}
for(;i >= loop;i--){
arr[i][j] = count++;
}
//确保循环出发点+1
start++;
}
//确保特殊情况有值
if(n % 2 == 1){
arr[start][start] = count;
}
return arr;
}