最長的上升子序列長度
public int cacuLongest(int []nums){
int len=nums.length;
int []stack=new int[len];
int stackLen=0;
stack[0]=nums[0];
for(int i=1;i<len;i++){
int curr=nums[i];
int top=stack[stackLen];
if(curr>top){
stackLen++;
stack[stackLen]=curr;
}
else
{
int left = 0, right = stackLen;
int middle;
while(left <= right){
middle = (left + right) / 2;
if (curr>stack[middle]){
left = middle+1;
}
else{
right = middle-1;
}
}//二分搜索結束
int cover=left;
stack[cover] = curr;
}
}//for循環結束
return stackLen+1;
}
DFS生成N對圓括號
public class generBrackets{
public List<String> genrate(int n){
List<String> ansList=new ArrayList<String>();
if(n<=0){
return ansList;
}
String curr="";
dfs(ansList,curr,n,n);
return ansList;
}
public void dfs(List<String>ansList,String curr,int left,int right){
if(left>right){
return ;
}
if(left==0&&right==0){
ansList.add(curr);
}
if(left>0){
String tempLeft=curr+"(";
dfs(ansList,tempLeft,left-1,right);
}
if(right>0){
String tempRight=curr+")";
dfs(ansList,tempRight,left,right-1);
}
}
}
數組的全排列:非遞歸
public class getNumsArrange
{
static ArrayList<ArrayList<Integer>> finalList=new ArrayList<ArrayList<Integer>>();
public void generateBigger(int []nums)
{
int len=nums.length,int left=len-2;
while(left>=0){
int right=left+1;
if(nums[left]<=nums[right]){
break;
}
left--;
}
if(left<0){
return ;
}
int bigIndex;
for(bigIndex=len-1;bigIndex>left;bigIndex--){
if(nums[bigIndex]>nums[left]){
break;
}
}
swap(nums,left,bigIndex);
int i=left+1;
int j=len-1;
while(i<=j){
swap(nums,i,j);
i++;
j--;
}
addList(nums);
generateBigger(nums);
}
}