给定n个表示高程地图的非负整数,其中 每个酒吧的宽度为1,计算它能够捕获多少水 下雨了. 例如,给定 [0,1,0,2,1,0,1,3,2,1,2,1],返回6。
public static int trap(int[] a){
final int n=a.length;
int[] left_peak=new int[n];
int[] right_peak=new int[n];
for (int i = 0; i <n ; i++) {
left_peak[i]=Math.max(left_peak[i-1],a[i-1]);
}
for (int i = n-2; i >=0 ; --i) {
right_peak[i]=Math.max(right_peak[i+1],a[i+1]);
}
int sum=0;
for (int i = 0; i <n ; i++) {
int height=Math.min(left_peak[i],right_peak[i]);
if(height>a[i]){
sum+=height-a[i];
}
}
return sum;
}
public static int trapTwo(int[] a){
final int n=a.length;
int peak_index=0;
for (int i = 0; i <n ; i++) {
if(a[i]>a[peak_index])peak_index=i;
}
int water=0;
for (int i = 0,left_peak=0; i <peak_index ; i++) {
if(a[i]>left_peak)left_peak=a[i];
else water+=left_peak-a[i];
}
for (int i = n-1,right_peak=0; i >peak_index ; i--) {
if(a[i]>right_peak)right_peak=a[i];
else water+=right_peak-a[i];
}
return water;
}
给你一个代表图像的n × n二维矩阵。 将图像旋转90度 (顺时针)。 追问: 你能做到这一点吗?
public static void rotate(final int[][] matrix){
final int n=matrix.length;
for (int i = 0; i <n ; i++) {
for (int j = 0; j <n-1 ; j++) {
swap(matrix,i,j,n-1-j,n-1-i);
}
}
for (int i = 0; i <n/2 ; i++) {
for (int j = 0; j <n ; j++) {
swap(matrix,i,j,n-1-i,j);
}
}
}
private static void swap(int[][] matrix, int i, int j, int i1, int i2) {
int tmp=matrix[i][j];
matrix[i][j]=matrix[i1][i2];
matrix[i1][i2]=tmp;
}
给定一个表示为数字数组的数字,再加上一个数字。
public static int[] plusOne(int[] digits){
return add(digits,1);
}
private static int[] add(int[] digits, int i) {
int c=i;
for (int j = digits.length-1; j >=0 ; j--) {
digits[j]+=c;
c=digits[i]/10;
digits[i]%=10;
}
if(c>0){
int[] tmp=new int[digits.length+1];
System.arraycopy(digits,0,tmp,1,digits.length);
tmp[0]=c;
return tmp;
}else{
return digits;
}
}
你在爬楼梯。它需要n步才能到达顶部。 每次你可以爬1或2步。有多少不同的方式可以 你爬到山顶了?
public static int climbStairs(int n){
int prev=0;
int cur=1;
for (int i = 1; i <=n; i++) {
int tmp=cur;
cur+=prev;
prev=tmp;
}
return cur;
}