如和去解:
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 所在位置的数 为了让左右两边的数 一样