俩到经典题目

![]()
- import java.util.Scanner;
- public class day15 {
- // public static void main(String[] args) {
- // //计算二进制中1的个数
- // //计算二进制中1的个数
- // Scanner scanner = new Scanner(System.in);
- // while (scanner.hasNextInt()) {
- // int n = scanner.nextInt();
- // int count = 0;
- // for (int i = 0; i < 32; i++) {
- // if (((n >> i) & 1) == 1) {
- // count++;
- // }
- // }
- // System.out.println(count);
- // }
- // }
-
- }



1.想要取到每一种颜色,分别要是每个手所有颜色的和-每个手颜色最少的手套数量,这样从另外一个手任意取一只(另一种手套对应颜色不为0),都可以取到对应颜色
2.计算左手和右手方案最小值为计算的和
3.如果存在一只手,颜色为0,即当另一只手再也无法取到该颜色,这种方案一定不可行,用sum记录另一只没有对应颜色手套,累加到计算的和中
1,3操作是独立的,即颜色种类为0时执行1,颜色种类不为0时执行3
核心公式: sum+min(letSum-leftMin+1,rightSum-right+1)+1;
- import java.util.*;
- public class Gloves {
- public int findMinimum(int n, int[] left, int[] right) {
- // write code here
- int leftSum=0;
- int rightSum=0;
- int leftMin=Integer.MAX_VALUE;
- int rightMin=Integer.MAX_VALUE;
- int sum=0;//当手套为0时,另一只手套的数量
- for (int i = 0; i
- if (left[i] * right[i] == 0) {
- sum = left[i] + right[i] + sum;
- } else {
- leftSum += left[i];
- if (leftMin > left[i]) {
- leftMin = left[i];
- }
- rightSum += right[i];
- if (rightMin > right[i]) {
- rightMin = right[i];
- }
- }
- }
- return sum+Math.min(leftSum-leftMin+1,rightSum-rightMin+1)+1;
- }
- }