从0开始学习算法-第一天
数组-数组是存放在连续内存空间上的相同类型数据的集合
二分查找
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
class Solution{ public int search(int nums[],int target){ //确保target在数组内 if(target<nums[0]||target>nums[length-1]){ return -1; } int left=0; int right=nums.length-1; int middle=left+((right - left) >> 1); while(left<=right){ if(target>nums[middle]) left=middle+1; else if(target<nums[middle]) right=middle-1; else return middle; } return -1; } }
力扣27:删除数组元素
class Solution{ public int removeElement(int[] nums,int val){ //双指针 int slow=0; for(int fast=0;fast<nums.length;fast++){ if(nums[fast]!=val){ nums[slow]=nums[fast]; slow++; } } return slow; } }
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]
class Solution{ public int[] sortedSquares(int[] nums){ 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] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
class Solution{ public int minSubArrayLen(int s,int[]){ int left=0; int sum=0; int res=Integer.MAX_VALUE; for(int right=0;right<nums.length;right++){ sum+=nums[right]; while(sum>=s){ res=Math.min(result,right-left+1); sum-=nums[left]; left++; } } return result ==Integer.MAX_VALUE?0:result; } }
59.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
class Solution(){ public int[][] generateMatrix(int n){ //使用二维数组定义结果矩阵 int[][] res=new int[n][n]; //定义每循环一个圈的起始位置 int startx=0,starty=0; //每个圈循环几次,如果n是奇数的话单独处理 int loop=n/2; //矩阵的中间位置 int mid=n/2; //用来给矩阵中每一个空格赋值 int offset=1; int i,j; while(loop--){ i=startx;//行 j=starty;//列 //下面开始的四个for就是模拟转了一圈 //模拟填充上行从左到右 for(j=starty;j<n-offset;j++){ res[startx][j]=count++; } //填充右列 for(i=startx;i<n-offset;i++){ res[i][j]=count++; } //填充下行 for(;j>starty;j--){ res[i][j]=count++; } //填充左列 for(;i>startx;i--){ res[i][j]=count++; } //第二圈开始,起始位置要加1 startx++; starty++; //offset控制每一圈里每一条边的遍历长度 offset+=1; //如果n为奇数,需要给矩阵最中间位置赋值 if(n%2!=0){ res[mid][mid]=count; } return res; }