package y2019.Algorithm.array.medium;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.array.medium
* @ClassName: SortColors
* @Author: xiaof
* @Description: TODO 75. Sort Colors
* Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent,
* with the colors in the order red, white and blue.
* Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
*
* Input: [2,0,2,1,1,0]
* Output: [0,0,1,1,2,2]
*
* 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
* 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/sort-colors
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*
* 大神答案参考:https://leetcode.com/problems/sort-colors/discuss/26472/Share-my-at-most-two-pass-constant-space-10-line-solution
*
* @Date: 2019/7/19 9:03
* @Version: 1.0
*/
public class SortColors { public void solution(int[] nums) {
//这里进行hash放置的话,可能会产生冲突,那么就需要把hash值依次往后排,然后和对应的值交换位置
//针对这题,因为只有三类数据,那么0再最开头,2再最末尾,其余的就会被放到中间
int index0 = 0, index2 = nums.length - 1;
for(int i = 0; i <= index2; ++i) {
while(nums[i] == 2 && i < index2) {
//当指定位置是2,那么我们吧他交换到指定的2的位置
//并且这里赋值字后,如果值改变了,那么就会跳出while循环,NB
nums[i] = nums[index2];
nums[index2--] = 2;
}
//然后交换0的位置
while(nums[i] == 0 && i > index0) {
nums[i] = nums[index0];
nums[index0++] = 0;
}
} } public static void main(String[] args) {
int data[] = {2,0,2,1,1,0};
SortColors fuc = new SortColors();
fuc.solution(data);
System.out.println();
}
}
package y2019.Algorithm.array.medium;

import java.util.HashMap;
import java.util.Map; /**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.array.medium
* @ClassName: SubarraySum
* @Author: xiaof
* @Description: TODO 560. Subarray Sum Equals K
*
* Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.
* Input:nums = [1,1,1], k = 2
* Output: 2
*
* @Date: 2019/7/19 9:50
* @Version: 1.0
*/
public class SubarraySum { public int solution(int[] nums, int k) {
//查子串和,那么我们遍历这个数组,然后求子串值,如果和超了,那么就把最前面的数剔除掉,然后再比较,小了就往后
int sum = 0, count = 0;
Map<Integer, Integer> sumMap = new HashMap();
sumMap.put(0, 1); //和为0的情况那么就是单独一个元素
//由于是求子串,子串是连续的,那么我们只要求出i->j连续的和是k即可
//而i->j = 0->j - 0->i 的差值,转而言之,我们需要把k + {0->i} = {0->j}求出来个数即可
for(int i = 0; i < nums.length; ++i) {
sum += nums[i];
//这里不需要考虑后面没有put进去的sum,因为我们要求i->j的和,只要判断前面的数据就可以了,后面的和放在后面比较
if(sumMap.containsKey(sum - k)) {
//那么就是存在
count += sumMap.get(sum - k);
}
//如果不包含,那么就把值放入,进行下一个子串的遍历
sumMap.put(sum, sumMap.getOrDefault(sum, 0) + 1);
} return count;
}
}
package y2019.Algorithm.array.medium;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.array.medium
* @ClassName: BuildTree
* @Author: xiaof
* @Description: TODO 105. Construct Binary Tree from Preorder and Inorder Traversal
* Given preorder and inorder traversal of a tree, construct the binary tree.
*
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
*
* preorder = [3,9,20,15,7]
* inorder = [9,3,15,20,7]
*
* 3
* / \
* 9 20
* / \
* 15 7
*
* @Date: 2019/7/19 10:31
* @Version: 1.0
*/
public class BuildTree { public class TreeNode {
private int value;
private TreeNode left;
private TreeNode right; public TreeNode(int x) {
this.value = x;
} public int getValue() {
return value;
} public void setValue(int value) {
this.value = value;
} public TreeNode getLeft() {
return left;
} public void setLeft(TreeNode left) {
this.left = left;
} public TreeNode getRight() {
return right;
} public void setRight(TreeNode right) {
this.right = right;
}
} public TreeNode solution(int[] preorder, int[] inorder) {
//根据前序遍历和中序组建一颗树
//探索类,考虑递归
return backTrack(preorder, 0, inorder, 0, inorder.length - 1); } public TreeNode backTrack(int[] preorder, int preLeft, int[] inorder, int inLeft, int inRight) {
if(preLeft > preorder.length - 1 || inLeft > inRight) {
return null;
}
//如果没有,我们可以吧当前树的前序遍历第一个当成根
TreeNode curRoot = new TreeNode(preorder[preLeft]);
int midIndex = 0;
//然后我们去中序寻找中间点
for(int i = inLeft; i <= inRight; ++i) {
if(preorder[preLeft] == inorder[i]) {
//找到位置
midIndex = i;
}
} //中分两边中序
//左子树
curRoot.setLeft(backTrack(preorder, preLeft + 1, inorder, inLeft, midIndex - 1));
curRoot.setRight(backTrack(preorder, preLeft + midIndex + 1 - inLeft, inorder, midIndex + 1, inRight));
return curRoot;
} public static void main(String[] args) {
int preorder1[] = {3,9,20,15,7};
int inorder1[] = {9,3,15,20,7};
BuildTree fuc = new BuildTree();
fuc.solution(preorder1, inorder1);
System.out.println();
}
}

【LEETCODE】60、数组分类,适中级别,题目:75、560、105的更多相关文章

  1. LeetCode:颜色分类【75】

    LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...

  2. LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)

    这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961).在大小为2N的数组A中,存在N+1个唯一元素,并且这些元 ...

  3. LeetCode:60. Permutation Sequence,n全排列的第k个子列

    LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...

  4. LeetCode:数组中的第K个最大元素【215】

    LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...

  5. LeetCode:数组专题

    数组专题 有关数组的一些 leetcode 题,在此做一些记录,不然没几天就忘光光了 二分查找 双指针 滑动窗口 前缀和/差分数组 二分查找 本文内容摘录自公众号labuladong中有关二分查找的文 ...

  6. LeetCode: 60. Permutation Sequence(Medium)

    1. 原题链接 https://leetcode.com/problems/permutation-sequence/description/ 2. 题目要求 给出整数 n和 k ,k代表从1到n的整 ...

  7. LeetCode一维数组的动态和

    一维数组的动态和 题目描述 给你一个数组 nums.数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]...nums[i]). 请返回 nums 的动态和. 示例 1: ...

  8. 【LEETCODE】61、对leetcode的想法&数组分类,适中级别,题目:162、73

    这几天一直再想这样刷题真的有必要么,这种单纯的刷题刷得到尽头么??? 这种出题的的题目是无限的随便百度,要多少题有多少题,那么我这一直刷的意义在哪里??? 最近一直苦苦思考,不明所以,刷题刷得更多的感 ...

  9. 【LEETCODE】58、数组分类,适中级别,题目:238、78、287

    package y2019.Algorithm.array.medium; import java.util.Arrays; /** * @ProjectName: cutter-point * @P ...

随机推荐

  1. JAVA基础--环境搭建

    概况 系统:win10 企业版 IDE:Eclipse 4.7.3 JDK:jdk1.8.0_171 数据库:SQLServer2012 Oracle,未安装MySQL 安装 JDK与开发工具(Ecl ...

  2. 大厂HR面试必备ES6中的深入浅出面试题知识点

    ESMAScript6简介,ES6是JavaScript语言的下一代标准,目的是让JavaScript语言可以写复杂的大型应用程序,成为企业级语言.那么ECMAScript和JavaScript的关系 ...

  3. struct 声明类

    #include <iostream> using namespace std; struct Student{ Student(char *name, int age, float sc ...

  4. vlc for mac设置中文的方法

    VLC for mac是一款mac系统下的多媒体播放器,支持播放MPEG-1.MPEG-2.MPEG-4.DivX.MP3和OGG,以及DVD.VCD.等各种流媒体协议在内的多种协议格式,并且能够对电 ...

  5. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  6. 如何使用gitbook写文档

    本文主要参考资料为该网址:https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md 如何想使用现成的gitbook,网络上虽说可以搜 ...

  7. 20190815网络与信息安全领域专项赛线上赛misc WriteUp

    目录 签到题 题目内容 使用工具 解题步骤 七代目 题目下载地址 使用工具 解题步骤 亚萨西 题目下载链接 使用工具 解题步骤 24word 题目下载链接 使用工具 解题步骤 感想 几星期前报了名却完 ...

  8. [技术博客] 【vagrant】硬盘扩容

    同样,这也是少昂早年走过的坑,这里直接贴出少昂个人博客链接:https://www.cnblogs.com/HansBug/p/9447020.html PS:有一位经验丰富的后端大佬坐镇指挥是多么幸 ...

  9. 同一个交换机 局域网内 内网IP ping不通为什么 没关闭windows防火墙

    同一个交换机 局域网内 内网IP  ping不通为什么  没关闭windows防火墙

  10. 2019t1_sumdoc_list.txt aa.docx acc baidu v2 sbb.docx Acc jindon v2 sbb.docx assetsList.html Atiitt 日本刑法典读后笔记.docx Atiti 遇到说花心的时候赞美应对.docx Atitit lesson.docx Atitit malye主义、mzd思想和dsp理论的区别和联系.docx Ati

    2019t1_sumdoc_list.txtaa.docxacc baidu v2 sbb.docxAcc jindon v2 sbb.docxassetsList.htmlAtiitt 日本刑法典读 ...