java每日练习_day09

  1. 螺旋数组
  2. 数字在排序数组中出现的次数
  3. 子集—II
  4. 组合
  5. 最大乘积

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值