- 螺旋数组
- 数字在排序数组中出现的次数
- 子集—II
- 组合
- 最大乘积
1. 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
public static List<Integer> spiralOrder(int[][] matrix) {
int row=matrix.length;
if(row==0) return new ArrayList<>();
int col=matrix[0].length;
if(col==0) return new ArrayList<>();
List<Integer>list=new ArrayList<Integer>();
int startRow=0;
int endRow=row-1;
int startCol=0;
int endCol=col-1;
while(startRow<=endRow&&startCol<=endCol){
if(startRow==endRow){//如果只剩下一行
for(int i=startCol;i<=endCol;i++){list.add(matrix[startRow][i]);}
return list;
}
if(startCol==endCol){//如果只剩下一列
for(int i=startRow;i<=endRow;i++){list.add(matrix[i][startCol]);}
return list;
}
for(int i=startCol;i<=endCol;i++) list.add(matrix[startRow][i]);//首行
for(int i=startRow+1;i<=endRow;i++) list.add(matrix[i][endCol]);//末列
for(int i=endCol-1;i>=startCol;i--) list.add(matrix[endRow][i]);//末行
for(int i=endRow-1;i>=startRow+1;i--) list.add(matrix[i][startCol]);//首列
startRow=startRow+1;
endRow=endRow-1;
startCol=startCol+1;
endCol=endCol-1;
}
return list;
}
2. 题目描述
统计一个数字在排序数组中出现的次数。
public static int GetNumberOfK(int [] array , int k) {
if(array.length==0) {
return 0;
}
//查左侧第一个
int left=getNumLeft(array,k);
//查右侧最后一个
int right=getNumRight(array,k);
System.out.println(right);
return right-left+1;
}
private static int getNumRight(int[] array, int k) {
int start=0;
int end=array.length-1;
int mid=0;
while(start<=end) {
mid=(start+end)/2;
if(array[mid]<=k) {
start=mid+1;
}else {
end=mid-1;
}
}
//System.out.println("val"+array[end]);
return end;
}
private static int getNumLeft(int[] array, int k) {
int start=0;
int end=array.length-1;
int mid=0;
while(start<=end) {
mid=(start+end)/2;
if(array[mid]>=k) {
end=mid-1;
}else if(array[mid]<k){
start=mid+1;
}
}
//System.out.println(array[start]);
return start;
}
3. 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
[4,4,4,1,4]
预期结果
[[],[1],[1,4],[1,4,4],[1,4,4,4],[1,4,4,4,4],[4],[4,4],[4,4,4],[4,4,4,4]]
public static List<List<Integer>> subsetsWithDup(int[] nums) {
//因为有重复元素,所以采取排序去重的方法
Arrays.sort(nums);
List<List<Integer>> ls=new ArrayList<>();
//利用位运算,找到所有可能的子集
int n=1<<nums.length;
for(int i=0;i<n;i++) {
//System.out.println(i);
List<Integer> al=new ArrayList<>();
for(int j=0;j<nums.length;j++) {
int m=1<<j;
if((i&m)!=0) {
al.add(nums[j]);
}
}
if(!ls.contains(al)) {
ls.add(al);
}
}
//System.out.println(ls);
return ls;
}
4. 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
public static List<List<Integer>> combine(int n, int k) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> subList = new ArrayList<>();
List<List<Integer>> list2 =getResult(list, subList, 1, n, k);
return list2;
}
private static List<List<Integer>> getResult(List<List<Integer>> list, List<Integer> subList, int start, int n, int k) {
if (k <= 0) {
ArrayList<Integer> tmpList = new ArrayList<>(subList);
list.add(tmpList);
return list;
}
while (start <= n - k + 1) {
subList.add(start);
getResult(list, subList, start + 1, n, k - 1);
subList.remove(subList.size() - 1);
start += 1;
}
return list;
}
5. 题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
示例1
输入 3 4 1 2
输出 24
public static long maximumProduct(int[] nums) {
int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE, min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
for (int n : nums) {
if (n > max1) {
max3 = max2;
max2 = max1;
max1 = n;
} else if (n > max2) {
max3 = max2;
max2 = n;
} else if (n > max3) {
max3 = n;
}
if (n < min1) {
min2 = min1;
min1 = n;
} else if (n < min2) {
min2 = n;
}
}
return Math.max((long) max1 * max2 * max3, (long) max1 * min1 * min2);
}