题目原链接:
有序数组的平方:
思路:
在一个有序的数组所有元素取平方之后,原先的数组大小顺序会因为负数的存在而发生改变,但依然遵从一定的规律,例如从开始元素到0元素的大小是递减的,0元素到最后元素的大小是递增的,可以依据这个规律利用双指针将两边较大的元素依次返回,实现一个时间复杂度为O(n)的算法去解决这个问题。
public static int[] sortedSquares(int[] nums) {
int left;
int right;
int[] result = new int[nums.length];
//将数组各个值的平方算出来
for(int i =0;i<nums.length;i++)
{
nums[i] = nums[i]*nums[i];
}
//利用双指针返回结果
left = 0;
right = nums.length-1;
for (int i = result.length-1; i >=0; i--) {
//对指针进行移动操作
if(nums[left]>=nums[right]){
result[i] = nums[left];
left++;
}
else {
result[i] = nums[right];
right--;
}
}
return result;
}
长度最小的子数组
思路:
依然是利用双指针,通过不断更新子数列从而找出最短的那一个
public int minSubArrayLen(int target, int[] nums) {
//记录下子数组元素之和
int sum = 0;
//记录下最小的连续子数组,需要不断更新其长度,因此初始即为最大值
int result = nums.length;
//记录子数组的长度
int temp;
//判断是否存在这样的子数组
int flag = 0;
//记录下子数组的初始位置
int star = 0;
//i为子数组的最终位置,需要对数组进行遍历
for (int i = 0; i < nums.length; i++) {
sum+=nums[i];
//当sum>target时则说明应该更新结果长度了
while(sum>=target){
//进入到这个循环则说明数组中存在题目所要求的连续子数组
flag = 1;
temp = i-star+1;
//如果这个记录打的子数组长度小于result中记录的长度的话则更新result的数据
if(result>temp){
result = temp;
}
//这时开始对起始下标进行移动
sum -= nums[star];
star++;
}
}
if(flag == 1)return result;
return 0;
}
螺旋矩阵
思路:首先确定进行循环的次数,然后思考当n为奇数与n为偶数之间形成的矩阵对于循环结果有什么影响,两者差别便在于循环结束后矩阵中心是否漏下一个区域没有进行赋值,因此在算法的最后要对n为奇数的矩阵中心进行最后的赋值
还有很重要的一点便是确定循环的方式,一圈循环要经历4次,那么每次究竟要以什么方式循环才合理,最优解应该是[left,right)的方式,因为这种方式可以在每一条边都这么进行而且可以访问到矩阵一圈的全部元素,写起来思路就更清晰
//想法:确定好每次循环的操作区间,最好是[left,right)这样左闭右开的形式,
//因为可以按照这个规律将整道题循环完毕
public static int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
//确认循环的次数,由规律的得到,每次循环的次数为n/2,
//奇数的话需要对中间空着的位置进行单独赋值
int loop = n/2;
int mid = n/2;//确认中心坐标
int starX = 0;//进行循环的初始坐标
int starY = 0;
int count =1;
int offset =1;//控制循环的长度,每次循环过后+1,
for (int i = 0; i < loop; i++) {
//进行上边从左到右循环,起始坐标为左上
for(int y =starY;y<n-offset;y++){
result[starX][y] = count;
count++;
}
//起始坐标调整为右上,进行右边从上到下循环
starY = n-offset;
for (int x = starX;x<n-offset;x++){
result[x][starY] = count;
count++;
}
//起始坐标调整为右下,进行下边从右往左循环
starX = n-offset;
for(int y =starY;y>offset-1;y--){
result[starX][y] = count;
count++;
}
//起始坐标调整为左下,进行左边从下往上循环
starY = offset-1;
for (int x = starX;x>offset-1;x--){
result[x][starY] = count;
count++;
}
//起始坐标再调整为左上
starX = offset-1;
offset++;
starY++;
starX++;
}
//判断n是否为奇数,奇数需要对中心进行额外赋值
if(n%2 != 0){
result[mid][mid] = count;
}
return result;
}
感谢观看!