算法学习之剑指offer(五)
题目1
题目描述
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length==0)
return false;
return check(sequence,0,sequence.length-1);
}
public boolean check(int [] sequence,int start,int end) {
//单个节点的情况
if((end-start)==0)
return true;
int i=end;
//找到左右子树分界点
for(;i>=start;i--)
if(sequence[i]<sequence[end])
break;
if(start>i)//说明全是右子树
return true;
//检查左子树里是不是有不符合的
for(int j=start;j<=i;j++)
if(sequence[j]>=sequence[end])
return false;
//不断对左右子树递归检查
return check(sequence,start,i)&&check(sequence,i+1,end-1);
}
}
题目2
题目描述
第一遍结果:
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return listAll;
ArrayList<Integer> list = new ArrayList<Integer>();
doFindPath(root,list,target);
return listAll;
}
public void doFindPath(TreeNode root,ArrayList<Integer> list,int target) {
if(root==null)
return;
target -= root.val;
list.add(root.val);
if(root.left==null&&root.right==null&&target==0)
listAll.add(list);
doFindPath(root.left,new ArrayList<Integer>(list),target);
doFindPath(root.right,new ArrayList<Integer>(list),target);
}
}
第二次参考他人的代码为:
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return listAll;
target -= root.val;
list.add(root.val);
if(root.left==null&&root.right==null&&target==0)
listAll.add(new ArrayList<Integer>(list));
FindPath(root.left,target);
FindPath(root.right,target);
list.remove(list.size()-1);
return listAll;
}
}
题目3
题目描述
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null)
return null;
RandomListNode node = pHead;
while(node!=null){
RandomListNode new_node = new RandomListNode(node.label);
new_node.next = node.next;
node.next = new_node;
node = new_node.next;
}
node = pHead;
while(node!=null){
if(node.random!=null)
node.next.random = node.random.next;
node = node.next.next;
}
RandomListNode head = pHead.next;
RandomListNode cirNode = pHead.next;
node = pHead;
while(node!=null){
node.next = node.next.next;
if(cirNode.next!=null)
cirNode.next = cirNode.next.next;
node = node.next;
cirNode = cirNode.next;
}
return head;
}
}
题目4
题目描述
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null)
return pRootOfTree;
TreeNode left = Convert(pRootOfTree.left);
TreeNode p = left;
while(p!=null&&p.right!=null)
p=p.right;
if(left!=null){
p.right=pRootOfTree;
pRootOfTree.left=p;
}
TreeNode right = Convert(pRootOfTree.right);
if(right!=null){
pRootOfTree.right=right;
right.left = pRootOfTree;
}
if(left!=null)
return left;
else
return pRootOfTree;
}
}
题目5
题目描述
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
import java.util.ArrayList;
import java.util.*;
public class Solution {
ArrayList<String> list = new ArrayList<String>();
HashSet<String> hs = new HashSet<String>();
public ArrayList<String> Permutation(String str) {
if(str==null||str.length()==0)
return list;
char[] chars = str.toCharArray();
doPermutation(chars,0,str.length()-1);
list.addAll(hs);
Collections.sort(list);
return list;
}
public void doPermutation(char[] chars,int start,int end) {
if(start==end){
StringBuilder sb = new StringBuilder();
for(char c:chars){
sb.append(c);
}
hs.add(sb.toString());
}else{
for(int i=start;i<=end;i++){
swap(chars,start,i);
doPermutation(chars,start+1,end);
swap(chars,start,i);
}
}
}
public void swap(char[] chars,int a,int b){
char tmp = chars[a];
chars[a] = chars[b];
chars[b] = tmp;
}
}
题目6
题目描述
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null)
return 0;
sort(array,0,array.length-1);
int index = (array.length)/2;
int times=0;
for(int i=0;i<array.length;i++)
if(array[i]==array[index])
times++;
if(times>index)
return array[index];
else
return 0;
}
public void sort(int [] array,int start,int end) {
if(start>=end)
return ;
int p = partition(array,start,end);
sort(array,start,p-1);
sort(array,p+1,end);
}
public int partition(int [] array,int start,int end) {
int p = start;
for(int i=start+1;i<=end;i++){
if(array[start]>array[i]){
swap(array,++p,i);
}
}
swap(array,p,start);
return p;
}
public void swap(int[] data, int a, int b) {
int tmp = data[a];
data[a] = data[b];
data[b] = tmp;
}
}
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n = array.length;
if (n == 0) return 0;
int num = array[0], count = 1;
for (int i = 1; i < n; i++) {
if (array[i] == num) count++;
else count--;
if (count == 0) {
num = array[i];
count = 1;
}
}
// Verifying
count = 0;
for (int i = 0; i < n; i++) {
if (array[i] == num) count++;
}
if (count * 2 > n) return num;
return 0;
}
}
算法学习之剑指offer(五)的更多相关文章
- 算法学习之剑指offer(十一)
一 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. import java.util.*; ...
- 算法学习之剑指offer(九)
一 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). public class Solution ...
- 算法学习之剑指offer(十)
一 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3 ...
- 算法学习之剑指offer(八)
题目一 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没 ...
- 算法学习之剑指offer(六)
题目1 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.*; public cl ...
- 算法学习之剑指offer(四)
题目1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /** public class TreeNode { int val = 0; Tree ...
- 算法学习之剑指offer(十二)
一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...
- 算法学习之剑指offer(七)
题目1 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P% ...
- 算法学习之剑指offer(三)
题目1 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在 ...
随机推荐
- Spring Cloud官方文档中文版-Spring Cloud Config(上)-服务端(配置中心)
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...
- SRAM和DRAM的区别
一.浅谈关于SRAM和DRAM的区别:https://www.cnblogs.com/nano94/p/4014082.html. 二.ROM.RAM.DRAM.SRAM和FLASH的区别,转自:ht ...
- FreeSql (十六)分页查询
IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, "Data ...
- FreeSql (二十)多表查询 WhereCascade
WhereCascade 多表查询时非常方便,有了它可以很轻松的完成类型软删除,租户条件的功能. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseCo ...
- python安装virtualenv虚拟环境步骤
一.安装virtualenv 点击左下角最边上菜单栏输入cmd,打开命令行 2.根据版本的不同输入命令pip install virtualenv(或者pip3 install virtualen ...
- [3]尝试用Unity3d制作一个王者荣耀(持续更新)->选择英雄-(中)
如果已经看过本章节:目录传送门:这是目录鸭~ 上节内容写了Actor管理器,那么这一节让我们先创建一个角色.(此章节开始加速...) 1.制作角色展示AssetBundle: 提取农药某个展示模型(S ...
- RabbitMQ的六种工作模式总结
最近学习RabbitMQ的使用方式,记录下来,方便以后使用,也方便和大家共享,相互交流. RabbitMQ的六种工作模式: 1.Work queues2.Publish/subscribe3.Rout ...
- vs加调试代码的正确姿势
为了方便,我们会在系统中加入一些调试代码,比如自动登录,这样会省掉很多精力时间,但用的姿势不对, 第一重姿势:打包注释 我看一些人在vs中加调试代码(比如自动登录),然后打包的时候注释掉,这样操作是省 ...
- 2019windows上安装Mac OS 10.14过程详细截图
之前VMware12里面的Mac OS10.10升级后,键盘鼠标就用不了了.试了几次都这样,只能重装VMware14, 安装Mac OS 10.14系统.把步骤截下图,分享一下. 一.材料准备 1.虚 ...
- Python学习-迭代器、生成器
一.迭代器 1. 可迭代对象 我们知道字符串.列表.元组.字典.集合都可以使用for语句进行循环遍历,然后输出每一个元素,这些都是可迭代对象. 检查对象是否是可迭代对象可以用两种方式去判断: (1)使 ...