26.二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/**
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 root)
{
if(root==null)return null;
if(root.left==null&&root.right==null)return root;
TreeNode left=Convert(root.left);
TreeNode p=left;
while(p!=null&&p.right!=null)
{
p=p.right;
}
if(left!=null)
{
p.right=root;
root.left=p;
}
TreeNode right=Convert(root.right);
if(right!=null)
{
root.right=right;
right.left=root;
}
return left!=null?left:root;
}
}
27.字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str)
{
ArrayList<String> res=new ArrayList<String>();
if(str.length()==0||str==null)return res;
int n= str.length();
helper(res,0,str.toCharArray());
Collections.sort(res);
return res;
}
public void helper( ArrayList<String> res,int index,char []s)
{
if(index==s.length-1)res.add(new String(s));
for(int i=index;i<s.length;i++)
{
if(i==index||s[index]!=s[i])
{
swap(s,index,i);
helper(res,index+1,s);
swap(s,index,i);
}
}
}
public void swap(char[]t,int i,int j)
{
char c=t[i];
t[i]=t[j];
t[j]=c;
}
}
28.数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int len=array.length;
if(len<1){
return 0;
}
int count=0;
Arrays.sort(array);
int num=array[len/2];
for(int i=0;i<len;i++){
if(num==array[i])
count++;
}
if(count<=(len/2)){
num=0;
}
return num;
}
}
29.最小的K个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(k == 0 || k > input.length) {
return list;
}
Arrays.sort(input);
for (int i = 0; i < k; i++) {
list.add(input[i]);
}
return list;
}
}
30.连续子数组的最大和
题目描述:连续子数组的最大和
import java.util.*;
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
List<Integer> list = new ArrayList<>();
for(int i=0;i<array.length;i++){
int sum = 0;
for(int j=i;j<array.length;j++){
sum += array[j];
list.add(sum);
}
}
if(list.size() <=0) return 0;
Collections.sort(list);
return list.get(list.size()-1);
}
}