编程题总结2

如和去解:

1.解题思路: 对于杨辉三角,来说可以转换为,一个直角三角型

 随着每一行的增加, 每一行的列随着 行数也在变换,在每一行的首和尾,都为1,看杨辉三角,变化,从3行开始,除了从一开始和结尾,中间的数,随着上面的两个去变化,随着数的增加,中间的数,都会随前一行上面对应的数,(同行上一个数和同护行上一个数加一)。

import java.util.ArrayList;
import java.util.List;

public List<List<Integer>> generate(int numRows){

    List<List<Integer>> lists = new ArrayList<List<Integer>>();
    
    for( int i = 1 ; i <= numRows ; i++){
        ArrayList<Integer> list = new ArrayList<Integer>();
        
          for(int j = 0 ; j < i ; j++){
                if(j == 0 || j == i - 1 ){
                    list.add(1);
                }else{
                   list.add( lists.get(i-2).get(j)+lists.get(i-2).get(j-1));                                  
                }
            }       

        lists.add(list);     
    }

return lists;
}

 

public boolean isToeplitzMatrix(int[][] matrix){
    int row= matrix.length;
    int col= matrix[0].length;
   //列方向
    for(int i = 0 ; i < col -1; i++){
        int x = 1;
        int y = i+1;  
        while( x >= 0 && x < row && y >= 0 && y < col){ //条件为判断循环里的条件不满足就跳出
            if(matrix[x][y] != matrix[0][i]){
                return false;

            }
            x++;
            y++;


        }

    }
    //2.行方向
        for( int i =  1  ; i < row - 1 ; i ++){
             int x = i + 1;
             int y = 1;
             while(x >= 0 && x < row && y >= 0 && y < col){
                if(matrix[x][y] != matrix[i][0]){
                        return false;
                }
                    x++;
                    y++;
             }

         }



        return true;


}

 思路:1.思考二位数组,如何去比较。

              首先:思考 行 和 列   分析 矩形  按对角线 依次去比较

            

public  boolean canThreeOartsEqualSum( int[] A){

    int sum  = 0;
    for(int a : A){
    
        sum+=a;

    }
    int Tsum = sum / 3;
    int count = 0;
    
    for(int i = 0 ; i < A.length ; i ++){
    
        Tsum -= A[i];
        if( Tsum == 0){
            count++;
            Tsum = sum / 3;

        }

        reutnrn count == 3;
    }












}

 

public int[] toSum(int[] numbers , int target){

    for(int i = 0 ; i < numbers.length ; i ++){
        int index = binarySearch(numbers,i+1,numbers.length-1,target3 - numbers[i]);
            if( index != -1){
             return new int[]={i + 1 , index+1};
            }

    }

           return null;

}

public int binarySearch(int[] arr , int begin , int end ,int key){
    int row = begin;
    int low = end;
    int mid = (row + low)/2;
    while(arr[mid] != key){

        if(arr[mid] > key){

           low = mid - 1;

         }else if(arr[mid] < key){

            row = mid + 1;

        }else if(row > low){
           return -1;
        }
        mid = (row + low)/2;

    }
  return mid;

}

 

public int[] findDiagonalOrader(int[][] matrix){
    
    //找到二位数组的行 和 列 长度
    int row = matrix.length;
    int col = matrix[0].length;
    
    //定义需要输出的数组
    int[] nums = new int[row * col];
    //定义开始遍历的点(第一个点)
    int i = 0;
    int j = 0; 

    //条件约束  为空
    if( matrix == null || matrix.length == 0){
        return new int[] {};
     }     
    // 列为空   
    if(  col == 0){
    return new int[] {};
     }
    // 为 一列
    if( col == 1){
        for(int i = 0; i < row ; i ++){
            nums[i] = matrix[i][0];
        }
        return nums;
    }

    int index = 0;   //作为数组存入的下标。
    
    while( i < row && j < col){   //循环读取 二位数组的数
        
        //读取到 就 存到 数组 nums中
        nums[index++] = matrix[i][j];
         //根据 i + j  = 偶数 还是 奇数 判段 是 右上 还是 左下。
        if( (i + j) % 2 == 0){  // 偶数  右上
        
            if(i == 0 && j != col -1){  // 比如 0,0 这个点 继续遍历 只能去 0,1
                j++;
            }else if( j == col -1){
                i++;

            } else{
                i--;
                j++;
        
            }


        }else{
            if( j == 0 && i != row -1){
                i++;
        
             }else if(i == col -1){
                j++;
             }else{
                i++;
                j--;
             }

        }

    }

    return nums;
}

 

public int pivotIndex(int[] nums){
    if( nums == null ){

        return -1;

    }
    int sum =0;
    int leftsum = 0;
    int rightsum = 0;
    for(int num: nums){
        sum+=num;
    }
    
    for( int i = 0 ; i < nums.length ; i++){
        if( i == 0){
            leftsum = 0;


        }else{
            leftsum += nums[i-1];

        }
        rightsum = sum -  leftsum - nums[i];
        if(leftsum == rightsum){
            return i;

        }


    }
    return -1;
}

思路:将左边的和右边的去比 比较是 减去  i 所在位置的数  为了让左右两边的数 一样

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值