977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
因为数组是有序的,所以平方后的数组中最大的一定在数组的两边。所以使用两个指针分别指向数组的两边,比较两端的平凡的大小。将大的一边的数值填入新的数组并将此指针向里内收,再次判断。。。。
int right = nums.length - 1;
int left = 0;
int[] result = new int[nums.length];
int index = result.length - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
// 正数的相对位置是不变的, 需要调整的是负数平方后的相对位置
result[index--] = nums[left] * nums[left];
++left;
} else {
result[index--] = nums[right] * nums[right];
--right;
}
}
return result;
注意数组的顺序是逆序还是顺序
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
这道题常规来说就是利用两个循环将所有的情况全部遍历出来,改进后使用了双指针的方法。 该开始的时候我以为要先将数组排序后再用滑动窗口法解出来,后来发现根本不用。
此题首先定义两个指针表示滑块的左右两端点,然后将右端点不断地移动至数组尾部。再次过程中不断地计算块内的值和目标值进行比较,当大于目标值的时候,移动左端点并记录滑块的长度。下一次大于目标值的时候比较记录的长度和当前的长度取最小值
public int minSubArrayLen(int target, int[] nums) {
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) {
int len=right-left+1;
result =Math.min(result,len);
sum-=nums[left];
left++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
注意 当块内和大于目标值时才记录的长度就是此时滑块的值(数学问题)
59.螺旋矩阵II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
来源:力扣(LeetCode) 链接:leetcode.cn/problems/sp… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题考察的的是对数组的范围掌握,重要的是边界的确定。
对四个角的处理我们选择处理前一个。
思路是确定循环的圈数然后在每一个循环中顺时针填写数据
public int[][] generateMatrix(int n) {
int loop = 0;//循环的圈数
int[][] result = new int[n][n];
int star = 0; //开始位置
int count = 1;//要填写的数据
int i, j;
while (loop < n / 2) {
//例如当n=4时循环两圈,当n=3先循环一圈在后面将中间的空填上
// 模拟上侧从左到右
for (j = star; j < n - star-1; j++) {
result[star][j] = count++;
}
// 模拟右侧从上到下
for (i = star ;i <n - star-1 ;i++){
result[i][n-star-1] = count++;
}
// 模拟下侧从右到左
for (j = n-star-1; j>star;j--){
result[n-star-1][j] =count++;
}
// 模拟左侧从下到上
for (i = n-star-1; i>star;i--){
result[i][star] =count++;
}
star++;//更改循环位置进入内圈。
loop++;
}
if (n % 2 == 1) {
result[star][star] = count;
}
return result;
}
这道题关键就是思路清晰不要搞混边界,然后回头改又乱了
总结
两天的时间简单的过了一遍数组,关于数组的题目无非就是增删改查但是细节和使用的方法还是很重要的。主要是对的是双指针法的使用更加的顺畅了,希望能记住吧....