[02]-小專題

最長的上升子序列長度

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章