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();
}
}
}