算法学习之剑指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,原来在 ...
随机推荐
- Django之FBV和CBV的用法
FBV FBV,即 func base views,函数视图,在视图里使用函数处理请求. 以用户注册代码为例, 使用两个函数完成注册 初级注册代码 def register(request): &qu ...
- HTML连载37-边框属性(下)、边框练习
一.边框属性 1.连写(分别设置四条边的边框) border-width:上 右 下 左: border-style:上 右 下 左: border-color:上 右 下 左: 注意点: (1)这三 ...
- 微软发布.Net Core 3.0 RC1,最终版本定于9月23日
2019.9.17 微软 宣布推出.NET Core 3.0 Release Candidate 1.就像Preview 9一样,主要专注于为 .NET Core 3.0 发布最终版本 .现在变得非常 ...
- 多场景抢红包业务引发.NETCore下使用适配器模式实现业务接口分离
事情的起因 我们公司现有一块业务叫做抢红包,最初的想法只是实现了一个初代版本,就是给指定的好友单发红包,随着业务的发展,发红包和抢红包的场景也越来越多,目前主要应用的场景有:单聊发红包.群聊发红包.名 ...
- DevExpress的PdfViewer添加工具栏实现PDF打开、预览、保存、打印
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
- Winform中实现ZedGraph曲线图的图像复制到剪切板、打印预览、获取图片并保存、另存为的功能
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- TestNG(十三) 参数化测试(DataProvider)
package com.course.testng.Parameter; import org.testng.annotations.DataProvider; import org.testng.a ...
- nginx 模块
8.nginx开启目录浏览 提供下载功能 默认情况下,网站返回index指定的主页,但如果该网站不存在主页,则将请求交给autoindex模块 ##### 如果开启autoindex模块,则提供一个下 ...
- Bean 装配,从 Spring 到 Spring Boot
目录 从SSM的集成谈到Bean的装配 Bean的装配 由XML到Java Config 自动扫描 Bean的注入 SSM集成的Java版 Spring Boot Magic Auto Confi ...
- SpringCloud微服务笔记-Nginx实现网关反向代理
背景 当前在SpringCloud微服务架构下,网关作为服务的入口尤为重要,一旦网关发生单点故障会导致整个服务集群瘫痪,为了保证网关的高可用可以通过Nginx的反向代理功能实现网关的高可用. 项目源码 ...