劍指offer學習筆記2

2021-09-23 18:56:31 字數 3041 閱讀 2294

void matrix(vector

>& num, int x1, int y1, int x2, int y2)

if (x1 < x2)

}if (x1 < x2 && y1 < y2)

}if (x2 - x1 > 1 && y1 < y2)

}x1++, y1++, x2--, y2--;

}}

template

class stackwithmin

else

}void pop()

t top()

t min()

bool empty()

private:

stack

m_data;

stack

m_min;

};

bool ispoporder(int num1, int num2, int len)

s.push(*p++);

}if (s.top() != *q)

s.pop();

q++;

}if (s.empty() && q - num2 == len)

}return

false;

}

bool verifybst(int num, int

len)

int i = 0;

while (i < len - 1)

else

}int j = i;

while (j < len - 1)

else

}bool left = true;

if (i > 0)

bool right = true;

if (i < len - 1)

return left && right;

}

void findpath(treenode *root, int expectedsum, vector

& path, int currentsum)

path.push_back(root->val);

currentsum += root->val;

bool isleaf = root->left == null && root->right == null;

if (expectedsum = currentsum && isleaf)

cout

findpath(root->right, expectedsum, path, currentsum);

currentsum -= root->val;

path.pop_back();

}void findpath(treenode *root, int expectedsum)

vector

path;

int currentsum = 0;

findpath(root, expectedsum, path, currentsum);

}

complexlistnode* copylist(complexlistnode *head)

//copy list

complexlistnode *p = head;

while (p !=

null)

//deal with the sibling

p = head;

while (p !=

null)

p = p2->next;

}//separate the list

complexlistnode *newhead = head->next;

complexlistnode *pre1 = head;

complexlistnode *pre2 = newhead;

p = newhead->next;

while (p !=

null)

pre1->next =

null;

return newhead;

}

void converthelp(treenode *root, treenode *&last)

treenode *cur = root;

if (cur->left !=

null)

cur->left = last;

if (last !=

null)

last = cur;

if (cur->right !=

null)

}treenode* convert(treenode *root)

return p;

}

void perhelp(char *str1, char *str2) 

}

int n[10] = ;

void permutation(int num, bool flag, int

len, int pos)

else

flag[i] = false;}}

}

/* 演算法說明:從n個數中選m個數,可以分解為以下兩步:

* (1)首先從n個數中選取編號最大的數,然後在剩下的n-1個數中選取m-1個數,直到從n-(m-1)個數中選取1個數為止。

* (2)從n個數中選取編號次小的乙個數,繼續執行第(1)步,直到當前可選編號最大的數為m。

*//* 求從a[n]中選取m個數的可能組合。陣列a[n]表示候選集;b[m]用來儲存當前組合中的某個元素,

* 這裡儲存的是這個元素在a中的下標;常量m表示滿足條件的乙個組合中元素的個數,m=m,m只用來輸出結果

*/void combine(int a, int b, int n, int m, int m)

else

cout

<}

}}

劍指offer學習筆記

筆記主要記錄方法和知識點 知識點1 負數與補碼 乙個參考 知識點2 移位操作 右移 變小 按位 操作 知識點3 0xffffffff表示32位 1 o logn 的方法 非遞迴的快速冪,用到二進位制表示。在迴圈內注意base base。兩個指標等間距一起走。想明白斷開鍊錶這個事情,相當於操作是在原有...

劍指offer 學習筆記 樹

樹的寬度 廣度 優先遍歷 先訪問樹的第一層節點,再訪問第二層節點,直到最後一層。同一層節點中,從左到右依次訪問。二叉搜尋樹中,左子節點總是小於等於根節點,右子節點總是大於等於根節點。我們可以平均在o logn 的時間內根據節點值在二叉搜尋樹中找到乙個節點。二叉樹的特例有堆和紅黑樹。堆分最大堆和最小堆...

劍指offer筆記

對於這道題來說,書上的和leetcode上的是不一樣的。在leetcode上,是一位陣列中判斷是否有重複數字,有的話任意返回乙個就行。這個思路也有兩個 1.先用乙個排序如快排o nlogn 然後就判斷相鄰元素是否相等,若相等直接返回即可。2.用乙個集合set,遍歷陣列放進去,因為集合有唯一性,若哪個...