从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;
	}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务