1. 给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0…K],右部分A[K+1…N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?
给定整数数组A和数组的大小n,请返回题目所求的答案。
测试样例:
[2,7,3,1,1],5
返回:6
这道题我有两种解法,第一种解法可能和本题分为两个部分没啥关系,直接在一个数组中将最大值和最小值求出,直接求出相差的值。代码如下:
import java. util. * ;
public class Main {
public int findMaxGap ( int [ ] A , int n) {
int max = Integer . MIN_VALUE;
for ( int i = 0 ; i < A . length; i++ ) {
if ( max < A [ i] ) {
max = A [ i] ;
}
}
return max - Math . min ( A [ 0 ] , A [ A . length- 1 ] ) ;
}
}
然后是第二种方法,第二种方法就是定义两个指针一个从左走,一个从右走,两个指针相遇即退出循环,然后两个指针分别找到最大值,然后进行最大值相减。
public class Main {
public int findMaxGap ( int [ ] A , int n) {
int max1 = A [ 0 ] ;
int max = Math . abs ( A [ 0 ] - A [ n- 1 ] ) ;
for ( int i = 0 ; i < n- 1 ; i++ ) {
if ( A [ i] > max1) {
max1 = A [ i] ;
}
int max2 = A [ A . length - 1 ] ;
for ( int j = n - 1 ; j > i; j-- ) {
if ( A [ j] > max2) {
max2 = A [ j] ;
}
if ( Math . abs ( max1 - max2) > max) {
max = Math . abs ( max1 - max2) ;
}
}
}
return max;
}
2. 对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]
解题思路就是将矩阵看成一个正方形,将他四条表逆时针转,将每个位置的矩阵一次放入一个一维数组,最后将数组返回。所以我们需要定义这个矩阵的位置,设矩阵左上开始的点为(x1,y1),矩阵最后一行的最右边坐标为(x2,y2).因此,代码如下:
public int [ ] clockwisePrint ( int [ ] [ ] mat, int n, int m) {
int x1 = 0 ;
int x2 = n- 1 ;
int y1 = 0 ;
int y2 = m - 1 ;
int [ ] arr = new int [ n* m] ;
int index = 0 ;
while ( x1 <= x2 && y1 <= y2) {
for ( int i = y1; i <= y2; i++ ) {
arr[ index++ ] = mat[ x1] [ i] ;
}
for ( int i = x1+ 1 ; i <= x2; i++ ) {
arr[ index++ ] = mat[ i] [ y2] ;
}
if ( x1 < x2) {
for ( int i = y2- 1 ; i >= y1; i-- ) {
arr[ index++ ] = mat[ x2] [ i] ;
}
}
if ( y1 < y2) {
for ( int i = x2 - 1 ; i >= x1 + 1 ; i-- ) {
arr[ index++ ] = mat[ i] [ y1] ;
}
}
x1++ ;
y1++ ;
x2-- ;
y2-- ;
}
return arr;
}