Java实现Leetcode题(数组)

  Leetcode704(二分查找)

public class Two_Findway {
	public static void main(String[] args) {
		int[] nums = {-1,0,3,5,9,12};
		int target = 9;
		int index = findNum2(nums,target);
		System.out.println(index);
	
	}
	//写法一,左闭右闭 [1,1]  left middle right
	private static int findNum(int[] arrays, int target) {
		// TODO Auto-generated method stub
		int left = 0; //左取值
		int right = arrays.length-1; //右闭
		while(left<=right) {  //[1,1] <=才满足条件
			int middle = (left+right)/2;//注意middle的赋值要写在while循环中
			if(arrays[middle]>target) {
				right = middle-1;   //因为右闭的原因,所以arrays[middle]!=arrays[right],所以不用取到索引为right的值
			}else if(arrays[middle]<target) {
				left = middle+1;
			}else {
				return middle;
			}
		}
		return -1;
	}
	//写法二,左闭右开[1,1)
	private static int findNum2(int[] arrays,int target) {
		int left = 0;//左闭
		int right = arrays.length;//右开
		while(left<right) {
			int middle = (left+right)/2;
			if(arrays[middle]>target) {
				right = middle;
			}else if(arrays[middle]<target) {
				left = middle+1;
			}else {
				return middle;
			}
		}
		return -1;
	}

	
}

Leetcode27(移除数组)


//数组移除
public class Remove_Element {
	
	public static void main(String[] args) {
		int[] arrays = {0,1,2,2,3,0,4,2};
		int val = 2;
		int size = removeElement5(arrays,val);
		System.out.print(size);
		for(int i=0;i<arrays.length;i++) {
			System.out.print(arrays[i]);
		}
	}
	//暴力解法
	public static int removeElement(int[] arrays,int val) {
		int size = arrays.length;
		for(int i=0;i<size;i++) { //外层找相同值
			if(arrays[i]==val) {
				for(int j=i+1;j<size;j++) { //重新赋值
					arrays[j-1]=arrays[j];
				}
				i--;   //因为后面的数前移了,所以i也要前移一位,这样才不会漏检,可以自己看过一遍流程
				size--;
			}
		}
		
		return size;
	}
	//双指针
	public static int removeElement1(int[] arrays,int val) {
		int slowIndex = 0;
		for(int fastIndex=0;fastIndex<arrays.length;fastIndex++) {
			if(arrays[fastIndex]!=val) {
				arrays[slowIndex] = arrays[fastIndex];
				slowIndex++;
			}
		}
	
		return slowIndex;
	}
	 public static  int removeElement3(int[] nums, int val) {
	        // 快慢指针
	        int slowIndex = 0;
	        for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
	            if (nums[fastIndex] != val) {
	                nums[slowIndex] = nums[fastIndex];
	                slowIndex++;
	            }
	        }
	        return slowIndex;
	    }
	 	
	 	//双向指针
 	public  static int removeElement5(int[] nums,int val) {
 		int left=0;
 		int right=nums.length-1;
 		while(nums[right]==val&&right>=0) { //把右边的val剔除
 			right--;
 		}
 		while(left<=right) {
 			if(nums[left]==val) {
 				nums[left] = nums[right]; //赋值了一个,已经存在数组中了
 				right--;//下一个值
 				while(nums[right]==val&&right>=0) {
		 			right--;
		 		}
 			}
 			left++;
 		}
 		return left;
 	}
	 
	 
	 
	 
	 
	 
	 	
	 	
	    public int removeElement4(int[] nums, int val) {
	        int left = 0;
	        int right = nums.length - 1;
	        while(right >= 0 && nums[right] == val) right--; //将right移到从右数第一个值不为val的位置
	        while(left <= right) {
	            if(nums[left] == val) { //left位置的元素需要移除
	                //将right位置的元素移到left(覆盖),right位置移除
	                nums[left] = nums[right];
	                right--;
	            }
	            left++;
	            while(right >= 0 && nums[right] == val) right--;
	        }
	        return left;
	    }

	

}

Leetcode997(有序数组的平方)

package arrays;
//有序数组的平方
public class Square_Array {
	public static void main(String[] args) {
		int[] nums= {-4,-1,0,3,10};
		demo(nums);
	}//双指针
	public static void demo(int[] arrays) {
		int[] currentArrays = new int[arrays.length];
		int left = 0;
		int right = arrays.length-1;
		int k = currentArrays.length-1;
		while(right>=left) {
			if(arrays[right]*arrays[right]>arrays[left]*arrays[left]) {
				currentArrays[k--]=arrays[right]*arrays[right];
				--right;
			}else if(arrays[right]*arrays[right]<=arrays[left]*arrays[left]) {
				currentArrays[k--]=arrays[left]*arrays[left];
				++left;
			}
		}
		for(int i =0;i<currentArrays.length;i++) {
			System.out.print(currentArrays[i]+"\t");
		}
	}
}



/*//暴力
 *for(int i =0;i<nums.length;i++) {
			nums[i]=nums[i]*nums[i];
		}
		
		for(int i=0;i<nums.length-1;i++) {
			for(int j =0;j<nums.length-1-i;j++) {
				if(nums[j+1]<= nums[j]) {
					int temp = nums[j];
					nums[j]=nums[j+1];
					nums[j+1]=temp;
				}
			}
		}
		
		for(int i=0;i<nums.length;i++) {
			for(int j =i+1;j<nums.length;j++) {
				if(nums[i]>nums[j]) {
					int temp=nums[i];
					nums[i] = nums[j];
					nums[j]= temp;
				}
			}
		}
		
		for(int i=0;i<nums.length;i++) {
			System.out.print(nums[i]+"\t");
		}
	} 
 * 
 * */

Leetcode209(长度最小的子数组)

package arrays;

public class Min_Arrays {
	public static void main(String[] args) {
		int[] nums = {2,3,1,2,4,3};
		int s=7;
		int length = demo02(nums,s);
		System.out.print(length);
	}
	//滑动窗口
	public static int demo02(int[] nums,int s) {
		int result = Integer.MAX_VALUE;
		int length=0;
		int i=0;
		int sum = 0;
		for(int j=0;j<nums.length;j++) {
			sum=sum+nums[j];
			while(sum>=s) { //不能用if,要用while来持续更新(1,1,1,1,100)
				length = j-i+1;
				result = result>length?length:result;
				sum=sum-nums[i++];
			}
		}
		
		return result==Integer.MAX_VALUE?0:result;
	}
	
	//暴力解法
	public static int demo(int[] nums,int s) {
		int result =Integer.MAX_VALUE;
		int length=0;
		for(int i =0;i<nums.length;i++) {
			int sum=0;
			for(int j=i;j<nums.length;j++) {
				sum=sum+nums[j];
				if(sum>=s) {
					length = j-i+1;
					result = result<length?result:length;
					break;
				}
			}	
		}
		return result==Integer.MAX_VALUE?0:result;
		
	}
	
}

Leetcode59(螺旋矩阵II)

package arrays;

public class Revert_Arrays {
	public static void main(String[] args) {
		revert(5);
	}
	
	public static void revert(int n) {
		int[][] arrays =new int[n][n];//创建数组
		int count=1;
		int loop=0;//循环次数
		int startX=0;
		int startY=0;
		int offset=1;//每次循环后一边减少一个格子
		int i,j;
		int mid = n/2;
		while(loop++<n/2) {
			i=startX;
			j=startY;
			//从左到右
			for(j = startX;j<n-offset;j++) {
				arrays[startX][j]=count;
				count++;
			}
			//从上到下
			for(i=startY;i<n-offset;i++) {
				arrays[i][j]=count;
				count++;
			}
			//从右到左
			for(;j>startX;j--) {
				arrays[i][j]=count;
				count++;
			}
			for(;i>startY;i--) {
				arrays[i][j]=count;
				count++;
			}
			startX++;
			startY++;
			offset++;		
		}
		if(n%2==1) {
			arrays[mid][mid]=count;
		}
		print(arrays);
	}
	
	
	//输出数组
	public static void print(int[][]  arrays) {
		for(int i=0;i<arrays.length;i++) {
			for(int j =0;j<arrays.length;j++) {
				System.out.print(arrays[i][j]+"\t");
			}
			System.out.println();
		}
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值