力扣部分思路總結(解題記錄)

題號 771(簡單題)

描述:查找S字符串中每一個元素是否在J中出現,並求和

思路:String find 函數 或者 hash結構

        int count = 0;
        int a[150] = {0};
        for(auto i:J){
            a[i] = 1;
        }
        for(auto i:S){
            if(a[i] == 1){
                count++;
            }
        }
        /*for(auto i:S) {
            if(J.find(i) != J.npos){
                count++;
            }
        }*/
        return count;

 

題號1104(中等題)

描述:一條龍二叉樹尋路問題 https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/

方法一:需要注意的點,由於是一條龍的順序,所以不能直接進行除以二的操作以查找父節點,需要進行轉換

轉換的方法是,t = a + b -x     a = 2^level-1   b = 2^(level-1)  x爲元素值 t爲父節點

int level = (log(label) / log(2)) + 1;//4
        int a;
        vector<int> path(level);
        path[level-1] = label;//p[3]=14
        level = level-1;//3
        while(level!=0){
            if(level % 2 == 1){ 
                a = pow(2,level+1) -1 + pow(2,level) -label;//9
                a = a/2;//4
                path[level-1] = a;//path[2]=4
            }
            else{
                a = label / 2;
                a = pow(2,level) -1 + pow(2,level-1) -a;
                path[level-1] = a;
            }
            level--;
            label=a;
        }
        path[0] = 1;
        return path;

方法二:位運算

因爲以1爲根節點層次編號的滿二叉樹可以對應到位的表示,所以用位運算的思路即可。

因爲每層的順序在變,所以每次需要對首位外的其它位取反。

舉例14=1110b,

先將14右移,變爲111b,然後對除第一位外所有位取反變爲100b,即它的根節點4,

同理100b,右移變爲10b,對除第一位外所有位取反變爲11b,即它的根節點3

一直到1結束。

代碼後期補上

 

題號 1122(簡單題)

描述:

給你兩個數組,arr1 和 arr2,

arr2 中的元素各不相同
arr2 中的每個元素都出現在 arr1 中
對 arr1 中的元素進行排序,使 arr1 中項的相對順序和 arr2 中的相對順序相同。未在 arr2 中出現過的元素需要按照升序放在 arr1 的末尾。

思路一:最弱智的想法,時間複雜度O(n*m),對兩個vector進行掃描,然後看是否在arr2中出現,如果出現的話,放入vector res中,最後把沒出現過的同意放到末尾處,未出現的元素要求升序

思路二:類似於771的hash思路,以空間換時間

 vector<int> pos(1001);
        for(auto i:arr1) ++pos[i];
        for(auto i:arr2) pos[i] *= -1;
        
        int cur=0;
        for(int i=0;i<arr2.size();++i){
            while(pos[arr2[i]]<0){
                arr1[cur++] = arr2[i];
                ++pos[arr2[i]];
            }
        }
        for(int i =0;i<arr1.size();i++)
            cout<<arr1[i]<<" ";
        for(int i=0;i<pos.size();++i){
            while(pos[i]>0){
                arr1[cur++] = i;
                --pos[i];
            }
        }
        return arr1;
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

題號:1105(中等)

描述:動態規劃,記住已解出的子問題的最優解

思路:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章