【LEETCODE】50、数组分类,简单级别,题目:888,1013,896,485,448,697
- package y2019.Algorithm.array;
- import java.util.HashSet;
- import java.util.Set;
- /**
- * @ProjectName: cutter-point
- * @Package: y2019.Algorithm.array
- * @ClassName: FairCandySwap
- * @Author: xiaof
- * @Description: TODO 888. Fair Candy Swap
- *
- * Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Alice has,
- * and B[j] is the size of the j-th bar of candy that Bob has.
- * Since they are friends, they would like to exchange one candy bar each so that after the exchange,
- * they both have the same total amount of candy. (The total amount of candy a person has is the sum of the sizes of candy bars they have.)
- * Return an integer array ans where ans[0] is the size of the candy bar that Alice must exchange,
- * and ans[1] is the size of the candy bar that Bob must exchange.
- * If there are multiple answers, you may return any one of them. It is guaranteed an answer exists.
- *
- * Input: A = [1,1], B = [2,2]
- * Output: [1,2]
- *
- * 交换A,B两个数组中的一个数字,使得两个数组的和相等。要返回的结果是个要交换的两个数字,分别来自A,B。
- *
- * @Date: 2019/7/8 9:25
- * @Version: 1.0
- */
- public class FairCandySwap {
- public int[] solution(int[] A, int[] B) {
- //说白了对数组求和,然后求两个数组的平均数的差值,然后看看是否存在这个差值
- Set seta = new HashSet();
- int[] result = new int[2];
- int suma = 0, sumb = 0;
- for(int i = 0; i < A.length; ++i) {
- seta.add(A[i]);
- suma += A[i];
- }
- for(int i = 0; i < B.length; ++i) {
- sumb += B[i];
- }
- //求两边数据跟平均数的差值,两边的和的平均数就是两边需要到达的数据
- //现在求B距离这个平均数的差距
- int dif = (suma + sumb) / 2 - sumb;
- //然后我们再第二个数组中找,看是否存在正好对应的补上
- for(int i = 0; i < B.length; ++i) {
- //获取对应i的数据值,判断B加上这个差距值,判断A中是否存在
- //因为吧b[i]移动过去之后,还要减去B[i]的值
- if(seta.contains(dif + B[i])) {
- //看看A中是否包含这个差值,如果包含,那么就可以返回了
- result[0] = dif + B[i];
- result[1] = B[i];
- // break;
- }
- }
- return result;
- }
- public static void main(String args[]) {
- int[] A = {1,2};
- int[] B = {2,3};
- System.out.println(new FairCandySwap().solution(A, B));
- }
- }
- package y2019.Algorithm.array;
- import java.util.stream.IntStream;
- /**
- * @ProjectName: cutter-point
- * @Package: y2019.Algorithm.array
- * @ClassName: CanThreePartsEqualSum
- * @Author: xiaof
- * @Description: TODO 1013. Partition Array Into Three Parts With Equal Sum
- * Given an array A of integers, return true if and only if we can partition the array into three non-empty parts with equal sums.
- * Formally, we can partition the array
- * if we can find indexes i+1 < j with (A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1])
- *
- * Input: [0,2,1,-6,6,-7,9,1,2,0,1]
- * Output: true
- * Explanation: 0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1
- *
- * 题目的意思应该是平均吧数据分成三等分,每份的和相同,并且每份数据要求是连续的
- *
- * @Date: 2019/7/9 9:18
- * @Version: 1.0
- */
- public class CanThreePartsEqualSum {
- public boolean solution(int[] A) {
- int sum = IntStream.of(A).sum(); //求和
- //分成三份
- int threeFen = sum / 3;
- //我们连续操作,获取,直到获取到三份
- boolean result = false;
- int index = 0;
- int tempSum = 0;
- int times = 0;
- while(index < A.length) {
- tempSum += A[index];
- if(tempSum == threeFen) {
- times++;
- tempSum = 0;
- }
- ++index;
- }
- if(times == 3) {
- result = true;
- }
- return result;
- }
- }
- package y2019.Algorithm.array;
- /**
- * @ProjectName: cutter-point
- * @Package: y2019.Algorithm.array
- * @ClassName: IsMonotonic
- * @Author: xiaof
- * @Description: TODO 896. Monotonic Array
- * An array is monotonic if it is either monotone increasing or monotone decreasing.
- * An array A is monotone increasing if for all i <= j, A[i] <= A[j].
- * An array A is monotone decreasing if for all i <= j, A[i] >= A[j].
- * Return true if and only if the given array A is monotonic.
- *
- * Input: [1,2,2,3]
- * Output: true
- *
- * 根据题意,这个数组应该是单向数组,递增,或者递减
- *
- * @Date: 2019/7/9 9:31
- * @Version: 1.0
- */
- public class IsMonotonic {
- public boolean solution(int[] A) {
- int direct = 0; //数组变化方向
- int curNum = A[0];
- for(int i = 1; i < A.length; ++i) {
- if(A[i] > curNum && (direct == 0 || direct == 1)) {
- direct = 1;
- curNum = A[i];
- } else if(A[i] < curNum && (direct == 0 || direct == 2)) {
- direct = 2;
- curNum = A[i];
- } else if (A[i] == curNum) {
- curNum = A[i];
- } else {
- return false;
- }
- }
- return true;
- }
- public static void main(String args[]) {
- int[] A = {1,1,0};
- int[] B = {2,3};
- System.out.println(new IsMonotonic().solution(A));
- }
- }
- package y2019.Algorithm.array;
- /**
- * @ProjectName: cutter-point
- * @Package: y2019.Algorithm.array
- * @ClassName: FindMaxConsecutiveOnes
- * @Author: xiaof
- * @Description: TODO 485. Max Consecutive Ones
- * Given a binary array, find the maximum number of consecutive 1s in this array.
- *
- * Input: [1,1,0,1,1,1]
- * Output: 3
- * Explanation: The first two digits or the last three digits are consecutive 1s.
- * The maximum number of consecutive 1s is 3.
- *
- * 统计最大1连续出现次数
- *
- * @Date: 2019/7/9 10:17
- * @Version: 1.0
- */
- public class FindMaxConsecutiveOnes {
- public int solution(int[] nums) {
- int maxTimes = 0;
- int cnt = 0;
- for(int i = 0; i < nums.length; ++i) {
- if(nums[i] == 1) {
- cnt++;
- } else {
- if(cnt > maxTimes) {
- maxTimes = cnt;
- }
- cnt = 0;
- }
- }
- //如果一直延续到循环末尾还是还是没有else,那么这里做最后拦截
- if(cnt > maxTimes) {
- maxTimes = cnt;
- }
- return maxTimes;
- }
- }
- package y2019.Algorithm.array;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.stream.IntStream;
- /**
- * @ProjectName: cutter-point
- * @Package: y2019.Algorithm.array
- * @ClassName: FindDisappearedNumbers
- * @Author: xiaof
- * @Description: TODO 448. Find All Numbers Disappeared in an Array
- * Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
- * Find all the elements of [1, n] inclusive that do not appear in this array.
- * Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
- *
- * Input:
- * [4,3,2,7,8,2,3,1]
- *
- * Output:
- * [5,6]
- *
- * @Date: 2019/7/9 10:25
- * @Version: 1.0
- */
- public class FindDisappearedNumbers {
- public List<Integer> solution(int[] nums) {
- List ret = new ArrayList();
- for(int i = 0; i < nums.length; ++i) {
- int val = Math.abs(nums[i]) - 1; //用来做下标位置
- if(nums[val] > 0) {
- nums[val] = -nums[val];//标记val大小的数据
- }
- }
- //遍历获取没有标记的数据
- for(int i = 0; i < nums.length; ++i) {
- if(nums[i] > 0) {
- ret.add(i + 1); //这个位置是没有标记到的
- }
- }
- return ret;
- }
- public static void main(String args[]) {
- int[] A = {4,3,2,7,8,2,3,1};
- int[] B = {2,3};
- System.out.println(new FindDisappearedNumbers().solution(A));
- }
- }
- package y2019.Algorithm.array;
- import java.util.HashMap;
- import java.util.Map;
- /**
- * @ProjectName: cutter-point
- * @Package: y2019.Algorithm.array
- * @ClassName: FindShortestSubArray
- * @Author: xiaof
- * @Description: TODO 697. Degree of an Array
- * Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any
- * one of its elements.
- * Your task is to find the smallest possible length of a (contiguous) subarray of nums, that has the same degree as nums.
- *
- * Input: [1, 2, 2, 3, 1]
- * Output: 2
- * Explanation:
- * The input array has a degree of 2 because both elements 1 and 2 appear twice.
- * Of the subarrays that have the same degree:
- * [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
- * The shortest length is 2. So return 2.
- *
- * 最短的子串使得其包含出现次数最多的元素,子串中刚好包含出现次数最多的数字
- *
- * @Date: 2019/7/9 14:06
- * @Version: 1.0
- */
- public class FindShortestSubArray {
- public int solution(int[] nums) {
- //1.首先统计出现次数最多的数据
- Integer maxTimesNum = 0, times = 0;
- //这里第二个参数用来放一个数组,三个数据,第一个次数,第二个第一次出现位置,第三个最后一次出现位置
- Map<Integer, int[]> countMap = new HashMap();
- for(int i = 0; i < nums.length; ++i) {
- if(!countMap.containsKey(nums[i])) {
- //如果不包含
- countMap.put(nums[i], new int[]{1, i, i});
- } else {
- //如果已经包含了
- int[] temp = countMap.get(nums[i]);
- temp[0]++;
- temp[2] = i;
- }
- }
- //2.然后统计这个数据的子串,所有这个字符出现的次数达到最大次数就结束遍历
- int result = 0, maxTimes = 0;
- for(int[] values : countMap.values()) {
- if(values[0] > maxTimes) {
- //新的出现次数最大值
- maxTimes = values[0];
- //计算子串长度
- result = values[2] - values[1] + 1;
- } else if (values[0] == maxTimes) {
- //出现次数一样,取最小子串
- result = Math.min(result, values[2] - values[1] + 1);
- }
- }
- return result;
- }
- public static void main(String args[]) {
- int[] A = {1,2,2,3,1};
- int[] B = {2,1,1,2,1,3,3,3,1,3,1,3,2};
- System.out.println(new FindShortestSubArray().solution(B));
- }
- }
【LEETCODE】50、数组分类,简单级别,题目:888,1013,896,485,448,697的更多相关文章
- 【LEETCODE】53、数组分类,简单级别,题目:989、674、1018、724、840、747
真的感觉有点难... 这还是简单级别... 我也是醉了 package y2019.Algorithm.array; import java.math.BigDecimal; import java. ...
- 【LEETCODE】54、数组分类,简单级别,题目:605、532
数组类,简单级别完结.... 不容易啊,基本都是靠百度答案.... 希望做过之后后面可以自己复习,自己学会这个解法 package y2019.Algorithm.array; /** * @Proj ...
- 【LeetCode】数组-1(643)-返回规定长度k的最大子数组的平均数
好久没有刷LeetCode了,准备重拾并坚持下去,每天刷个两小时.今天算是开始的第一天,不过出师不利,在一道很简单的题目上墨迹半天.不过还好,现在踩过的坑,应该都不会白踩,这些可能都是以后程序员路上稳 ...
- LeetCode:颜色分类【75】
LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...
- LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)
这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961).在大小为2N的数组A中,存在N+1个唯一元素,并且这些元 ...
- LeetCode~移除元素(简单)
移除元素(简单) 1. 题目描述 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使 ...
- 面阿里P7,竟问这么简单的题目?
关于作者:程序猿石头(ID: tangleithu),来自十八县贫困农村(查看我的逆袭之路),BAT某厂P7,是前大疆(无人机)技术主管,曾经也在创业公司待过,有着丰富的经验. 本文首发于微信公众号, ...
- LeetCode:数组中的第K个最大元素【215】
LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...
- 【剑指offer】50.数组中重复出现的数字
50.数组中重复出现的数字 知识点:数组:Set的不可重复性 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重 ...
- Java数据结构和算法之数组与简单排序
一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信 ...
随机推荐
- JS实现Base64编码、解码,即window.atob,window.btoa功能
window.atob(),window.btoa()方法可以对字符串精选base64编码和解码,但是有些环境比如nuxt的服务端环境没法使用window,所以需要自己实现一个base64的编码解码功 ...
- react的3种组件
推荐阅读:https://www.jianshu.com/p/2726b8654989 1. createClass 已不推荐使用,这里不再多讲.但你仍需要了解它,因为你可能会接触到一些旧项目,或者一 ...
- 一次修复linux的efi引导的集中方法总结记录
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/grub_uefi_repair 起因:EFI分区被删除导致引导问 ...
- Git基本介绍(三大分区及核心内部构造)
1. Git三大工作区(工作区.暂存区和版本库) 工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作: 暂存区(STAGIN AREA):数据(快照)暂时存放的地方: ...
- Confd+Consul 动态生成配置文件
一.Consul安装和配置 1.consul是什么? consul是HashiCorp公司推出的一款工具,主要用于实现分布式系统的服务发现与配置,它提供了以下几个关键特性: 服务发现:Consul客户 ...
- 刷题记录:[DDCTF 2019]homebrew event loop
目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...
- 剑指offer:构建乘积数组
题目描述: 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]. ...
- Java12新特性 -- 只保留一个 AArch64 实现
现状 当前 Java 11 及之前版本JDK中存在两个64位ARM端口.这些文件的主要来源位于src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目录 ...
- SDN实验---Ryu的应用开发(一)Hub实现
补充: (一)Ubuntu下安装Notepadqq 背景:为什么安装Notepadqq Notepad++ 不仅有语法高亮度显示,也有语法折叠功能,并且支持宏以及扩充基本功能的外挂模组.但是可惜的是N ...
- matlab学习笔记10_4MATLAB中的字符串表示
一起来学matlab-字符串操作 10_4 MATLAB中的字符串表示 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感 ...