我被这些题整哭了,你呢???

日了狗啊。。。。。。

好难啊。。。。

按照这个样子搞,不用找工作了,回家放牛去。。。。。。。

package y2019.Algorithm.divideandconquer.medium;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.divideandconquer.medium
* @ClassName: FindKthLargest
* @Author: xiaof
* @Description: 215. Kth Largest Element in an Array
* Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order,
* not the kth distinct element.
*
* Example 1:
*
* Input: [3,2,1,5,6,4] and k = 2
* Output: 5
*
* Example 2:
* Input: [3,2,3,1,2,4,5,5,6] and k = 4
* Output: 4
*
* 这题可以直接排序,然后获取第K个位置的数据即可,但是这不是本题的考察点
* 本地用快排,直接找到第k个坑的值
*
* @Date: 2019/8/13 8:59
* @Version: 1.0
*/
public class FindKthLargest { public int solution(int[] nums, int k) {
int l = 0, r = nums.length - 1; //定义快排的左右边界
while (l <= r) {
int pos = partition(nums, l, r);
//找到中间的位置
if (pos == k - 1) {
//找到对应的值
return nums[pos];
} else if (pos > k - 1) {
//如果位置比第k个数要大,那么说明第k位再左边
r = pos - 1;
} else {
l = pos + 1;
}
} return -1;
} public int partition(int[] nums, int l, int r) {
int init = nums[l], l1 = l + 1, r1 = r;
while (l1 <= r1) {
//遍历交换数据
if (nums[l1] < init && nums[r1] > init) {
//交换位置数据
int temp = nums[l1];
nums[l1++] = nums[r1];
nums[r1--] = temp;
} if (nums[l1] >= init) {
++l1;
} if (nums[r1] < init) {
--r1;
}
} //当r1越过l1的时候,交换回来
nums[l] = nums[r1];
nums[r1] = init; return r1;
} public static void main(String[] args) {
int s[] = {3,2,3,1,2,4,5,5,6};
int k = 4;
int s1[] = {1};
int k1 = 1;
int s2[] = {99,99};
int k2 = 1;
int s3[] = {2,1};
int k3 = 1;
int s4[] = {-1, 2, 0};
int k4 = 1; FindKthLargest fuc = new FindKthLargest(); fuc.solution(s4, k4); }
}
package y2019.Algorithm.divideandconquer.hard;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.divideandconquer.hard
* @ClassName: MaxCoins
* @Author: xiaof
* @Description: 312. Burst Balloons
* Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums.
* You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins.
* Here left and right are adjacent indices of i. After the burst, the left and right then becomes adjacent.
* Find the maximum coins you can collect by bursting the balloons wisely.
*
* Note:
* You may imagine nums[-1] = nums[n] = 1. They are not real therefore you can not burst them.
* 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100
* Example:
*
* Input: [3,1,5,8]
* Output: 167
* Explanation: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
* coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167
* @Date: 2019/8/13 9:43
* @Version: 1.0
*/
public class MaxCoins { public int solution(int[] nums) {
//逆向思维,我们发现每次都是再已经存在的气球中进行爆破,这里尝试改变想法为,本来没有气球,加入气球进行爆破
//我们从最后一步开始思考,每次只需要递归到上一层有+1个气球的时候,进行爆破得到当前环节
//1.首先创建长度+1的数组,因为起始和结束的位置默认为1
int[] resarray = new int[nums.length + 2];
int n = 1;
for (int x : nums) {
//这里排除掉为0的数据
if (x > 0) {
resarray[n++] = x;
}
}
resarray[0] = resarray[n++] = 1; //这个数组表示,再i,j区间内进行爆破的最大值
int[][] back = new int[n][n];
return burst(back, resarray, 0, n - 1);
} public int burst(int[][] back, int[] nums, int left, int right) {
//如果是边界,或两个索引之间没有空隙了,那么就不用插入了
if (left + 1 == right) return 0;
if (back[left][right] > 0) {
//如果已经计算过了,不做重复计算
return back[left][right];
}
//计算每个位置作为最后一个爆破点的时候值
int ans = 0;
for (int i = left + 1; i < right; ++i) {
ans = Math.max(ans, nums[left] * nums[i] * nums[right] + burst(back, nums, left, i) + burst(back, nums, i, right));
}
//修改值内容,继续递归
back[left][right] = ans;
return ans;
} /**
*
* @program: y2019.Algorithm.divideandconquer.hard.MaxCoins
* @description: https://leetcode.com/problems/burst-balloons/discuss/76228/Share-some-analysis-and-explanations
* @auther: xiaof
* @date: 2019/8/13 11:20
*/
public int maxCoins(int[] iNums) {
int[] nums = new int[iNums.length + 2];
int n = 1;
for (int x : iNums) if (x > 0) nums[n++] = x;
nums[0] = nums[n++] = 1; int[][] memo = new int[n][n];
return burst2(memo, nums, 0, n - 1);
} public int burst2(int[][] memo, int[] nums, int left, int right) {
if (left + 1 == right) return 0;
if (memo[left][right] > 0) return memo[left][right];
int ans = 0;
for (int i = left + 1; i < right; ++i)
ans = Math.max(ans, nums[left] * nums[i] * nums[right]
+ burst2(memo, nums, left, i) + burst2(memo, nums, i, right));
memo[left][right] = ans;
return ans;
} public static void main(String[] args) {
int s[] = {3,1,5,8};
int[] s1 = {8,2,6,8,9,8,1,4,1,5,3,0,7,7,0,4,2,2,5};
int[] s2 = {8,3,4,3,5,0,5,6,6,2,8,5,6,2,3,8,3,5,1,0,2}; MaxCoins fuc = new MaxCoins(); // fuc.solution(s2);
fuc.maxCoins(s2); }
}

【LEETCODE】67、分治递归,medium&hard级别,题目:215、312的更多相关文章

  1. [LeetCode题解]23. 合并K个升序链表 | 分治 + 递归

    方法一:分治 + 递归 解题思路 在21. 合并两个有序链表,我们知道如何合并两个有序链表.而本题是合并 k 个有序链表,可以通过大问题拆分成小问题解决,即把 k 个链表,拆分成 k/2 个链表组,俩 ...

  2. [array] leetcode - 39. Combination Sum - Medium

    leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...

  3. CF448C Painting Fence (分治递归)

    Codeforces Round #256 (Div. 2) C C. Painting Fence time limit per test 1 second memory limit per tes ...

  4. [array] leetcode - 48. Rotate Image - Medium

    leetcode - 48. Rotate Image - Medium descrition You are given an n x n 2D matrix representing an ima ...

  5. [array] leetcode - 31. Next Permutation - Medium

    leetcode - 31. Next Permutation - Medium descrition Implement next permutation, which rearranges num ...

  6. # Leetcode 67:Add Binary(二进制求和)

    Leetcode 67:Add Binary(二进制求和) (python.java) Given two binary strings, return their sum (also a binar ...

  7. 【LEETCODE】65、字符分类,medium&easy级别,题目:20、647、3

    今天的字符类还比较简单 package y2019.Algorithm.str.easy; import java.util.HashMap; import java.util.Map; import ...

  8. 【LEETCODE】64、链表分类,medium&hard级别,题目:2,138,142,23

    package y2019.Algorithm.LinkedList.medium; import y2019.Algorithm.LinkedList.ListNode; /** * @Projec ...

  9. LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...

随机推荐

  1. linux 运维基本操作

    本记录来自腾讯云实验  https://cloud.tencent.com/developer/labs/lab/10000 目录操作 任务时间:5min ~ 10min 创建目录 使用 mkdir ...

  2. SIT系统整合测试

    System Integrate Test的缩写,即系统整合测试      系统整合测试就是评估产品在其规格范围内的环境下工作,能否完成产品设计规格所需要的功能及与周边设备.应用软件的兼容性.大致可以 ...

  3. python自动化测试学习目录

    一.python学习目录 <1> ----python驱动 [python驱动]python进行selenium测试时GeckoDriver放在什么地方? python下浏览器静默运行驱动 ...

  4. exit命令

    exit命令用于退出当前shell,在shell脚本中可以终止当前脚本执行. 常用参数格式:exit n退出.设置退出码为n.(Cause the shell to exit with a statu ...

  5. 回滚事件只是让原数据看起来不变,但是id还是会自增吗?

    回滚事件只是让原数据看起来不变,但是id还是会自增对吗? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

  6. ELK实时日志分析平台环境部署,以及可视化展示

    ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件.新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent) ...

  7. 上传一句话木马时<? php被过滤的解决办法

    i春秋“百度杯”CTF比赛 九月场 web题 upload 题目描述:想怎么传就怎么传,就是这么任性.tips:flag在flag.php中 打开题目发现 于是想到通过上传一句话木马进入后台 上传一句 ...

  8. SpringBoot(十六):SpringBoot2.1.1集成fastjson,并使用fastjson替代默认的MappingJackson

    springboot2.1.1默认采用的json converter是MappingJackson,通过调试springboot项目中代码可以确定这点.在springboot项目中定义WebMvcCo ...

  9. JAVA获取树形结构

    package com.nnmzkj.common.dto; import lombok.Data; import java.io.Serializable;import java.util.Arra ...

  10. SketchyGAN: Towards Diverse and Realistic Sketch to Image Synthesis - 1 - 论文学习

    https://github.com/wchen342/SketchyGAN Abstract 从人体草图中合成逼真的图像是计算机图形学和视觉学中的一个具有挑战性的课题.现有的方法要么需要精确的边缘图 ...