LeetCode(二)

    1. package com.model.number;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/8/28 20:04
       * 跳跃问题
       */
      public class NumberDemo03 {
          public static int res=Integer.MAX_VALUE;
          public static void main(String[] args) {
      
              int[] arr={4,1,5,1,1,1,7,1,1,1};
              System.out.println(jump2(arr));
      
          }
          
      
          public static int jump2(int[] arr){
      //        无法跳跃的情况
              if (arr.length<1||arr[0] == 0){
                  return -1;
              }
      //
              int jump=0;
              int next=0;
              int cur=0;
              for (int i = 0; i < arr.length; i++) {
                  if (i>cur){
                      jump++;
                      cur=next;
                  }
                  next=Math.max(next, i+arr[i]);
              }
      
              return jump;
          }
      }
  1.  

    1. package com.model.number;
      
      import java.util.Arrays;
      import java.util.HashMap;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/8/28 23:16
       * 找出一个区间内最大的连续空间的长度
       */
      public class NumberDemo04 {
          public static void main(String[] args) {
              int[] arr={1,3,5,4,9,81,132,5456,65,2123,2};
              System.out.println(len(arr));
              System.out.println(arrLen(arr));
      
          }
          public static int len(int[] arr){
              for (int i = 0; i < arr.length-1; i++) {
                  for (int j = 0; j < arr.length-1-i; j++) {
                      if (arr[j]>arr[j+1]){
                          arr[j]=arr[j]^arr[j+1];
                          arr[j+1]=arr[j]^arr[j+1];
                          arr[j]=arr[j]^arr[j+1];
                      }
                  }
              }
              System.out.println(Arrays.toString(arr));
              int max=0;
              for (int i = 0; i < arr.length; i++) {
                  int temp=1;
                  for (int j = i+1; j < arr.length; j++) {
                      if (j-i==arr[j]-arr[i]){
                          temp++;
                      }else {
                          i=j;
      
                          break;
                      }
                  }
                  max=Math.max(max    , temp);
              }
              return max;
          }
      
          public static int arrLen(int[] arr){
      
              HashMap<Integer, Integer> map = new HashMap<>();
      //        map 中存放以某个数据为开头或者结尾的数据,key代表某个数,value代表的一共有几个连续的数
      //        首先将某个数据放进map中,查看是否存在以 num-1和num+1 为开头或结尾的数据存在
      //        如果存在就是将他们进行合并
              int res=0;
              for (int num:arr){
                  if (!map.containsKey(num)){
                      map.put(num, 1);
                      Integer leftLen = map.getOrDefault(num - 1, 0);
                      Integer rightLen =  map.getOrDefault(num + 1, 0);
                      int all=leftLen+1+rightLen;
                     map.put(num-leftLen, all);
                     map.put(num+ rightLen, all);
                     res=Math.max(all, res);
                  }
      
      
              }
              return res;
      
      
      
          }
      }
  2.  

    1. package com.model.array;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/8/28 23:58
       * 在二维数组中找出某个数target是否存在
       * 二维数组每一行都是有序的
       */
      public class ArrayDemo02 {
          public static void main(String[] args) {
      
              int[][] matrix={{1,2,3,4},{10,20,30,40},{11,12,13,45}};
              System.out.println(find(matrix, 13));
          }
          public static boolean find(int[][] matrix,int target){
      
              int row=0;
              int col=matrix[0].length-1;
              while (row<matrix.length&&col>=0){
                  if (matrix[row][col]<target){
                      row++;
                      col=matrix[0].length-1;
                  }else {
                      if (target==matrix[row][col]){
                          return true;
                      }
                      col--;
                  }
              }
              return false;
      
          }
      }
    1. package com.model.array;
      
      import java.util.ArrayList;
      import java.util.Arrays;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/8/29 0:14
       * 找到一个有0和1组成的二位数组
       * 找出那个行有最多1,返回那个行号
       * */
      public class ArrayDemo03 {
          public static void main(String[] args) {
      
              int[][] matrix={{1,1,1,1,1,1,1,1},{0,0,1,1,1,1,1,1},{0,0,0,0,1,1,1,1},{0,0,1,1,1,1,1,1}};
              ArrayList<Integer> list = matrix(matrix);
              for(Integer num:list){
                  System.out.println(num);
              }
      
      
              System.out.println(leftOne(matrix[0], 0, matrix[0].length - 1));
          }
          public static ArrayList<Integer> matrix(int[][] matrix){
              ArrayList<Integer> resList = new ArrayList<>();
      
              int max=matrix[0].length-1;
              for (int i = 0; i < matrix.length; i++) {
                  int index=leftOne(matrix[i],0,max-1);
                  if (index==max){
                      resList.add(i);
                  }
                  if (index<max){
                      resList.clear();
                      max=index;
                      resList.add(i);
                  }
              }
              return resList;
          }
      
      //    求出给定数组的最左侧的1的位置
          public  static int leftOne(int[] row,int left,int right){
              int index=row.length;
              int mid;
              while (left<=right){
                  mid=(left+right)/2;
                  if (row[mid]==1){
                      right=mid-1;
                      index=mid;
                  }else {
                      left=left+1;
                  }
              }
              return index;
      
          }
      }
    1. package com.model.array;
      
      import java.util.Arrays;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/8/29 13:19
       * 给定一个二维数组,如果某个位置上的0
       * 就将该位置的的行和列都置为0
       * 返回新的数组
       */
      public class ArrayDemo04 {
          public static void main(String[] args) {
              int[][] matrix = {
                      {0, 2, 0, 4, 5},
                      {1, 2, 3, 1, 5},
                      {1, 2, 1, 4, 0},
                      {0, 1, 3, 4, 5},
                      {1, 2, 1, 4, 5}
              };
              int[][] set0 = set0(matrix);
              for (int[] nums:matrix){
                  System.out.println(Arrays.toString(nums));
              }
      
          }
      
          //    减少额外空间复杂度
          public static int[][] set0(int[][] matrix) {
      
              boolean col1 = false;
      //        使用第一列记录需要指令的行,使用第一行记录需要置零的列
              for (int i = 0; i < matrix.length; i++) {
                  for (int j = 0; j < matrix[i].length; j++) {
                      if (matrix[i][j] == 0) {
                          matrix[i][0] = 0;
                          if (j == 0) {
                              col1 = true;
                          } else {
                              matrix[0][j] = 0;
                          }
                      }
                  }
              }
      //      使用第一行和第一列的数将需要置零的行和列置零,如果第一列的0行为零则是 第0行需要置零
              for (int i = matrix.length - 1; i >= 0; i--) {
                  for (int j =  1; j <matrix[i].length; j++) {
                      if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                          matrix[i][j] = 0;
                      }
                  }
              }
      //        第一列是否为0
              if (col1) {
                  for (int i = 0; i < matrix.length; i++) {
                      matrix[i][0] = 0;
                  }
              }
              return matrix;
          }
      }

       

        
  3.   
posted @ 2021-08-29 01:13  张紫韩  阅读(31)  评论(0编辑  收藏  举报