找前k个最小值可以用最大堆。
建堆默认是利用数组前k个元素当作它们是最小,如果有比最大堆最大的元素更小的数,那么弹出堆顶,弹入元素。最后遍历堆的元素即可。
class Solution:
def smallestK(self, arr: List[int], k: int) -> List[int]:
#建立一个最大堆
if k==0:
return list()
heap=[-arr[i] for i in range(k)]
heapq.heapify(heap)
for i in range(k,len(arr)):
if -heap[0]>arr[i]:
heapq.heappop(heap)
heapq.heappush(heap,-arr[i])
ans=[-x for x in heap]
return ans
160. 相交链表
相交链表确实有点脑筋急转弯的味道了。
双指针的应用方面之一了属于是。
其实可以让长的链表先走多出的部分然后比较剩下的部分。当相等时就结束比较。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==nullptr || headB==nullptr){
return NULL;
}
ListNode *pa=headA;
ListNode *pb=headB;
while(pa!=pb){
pa=pa==NULL?headB:pa->next;
pb=pb==NULL?headA:pb->next;
}
return pa;
}
};
二叉树的中序遍历
看来考虑问题还是的全面一些。
vector中新建一个容器开始的时候是空的。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
//if(root==nullptr)return root;
vector<int>ans;
stack<TreeNode *>s;
if(root!=nullptr)s.push(root);
TreeNode *p=root;
bool flag_left=true;
while(!s.empty()){
if(flag_left&&p->left!=nullptr ){
s.push(p->left);
p=p->left;
}
else{
ans.push_back(p->val);
s.pop();
if(p->right!=nullptr){
p=p->right;
s.push(p);
flag_left=true;
}
else{
if(!s.empty()) {
p=s.top();
flag_left=false;
}
}
}
}
return ans;
}
};
412

被折叠的 条评论
为什么被折叠?



