- 博客(15)
- 收藏
- 关注
原创 连续子数组的最大乘积
题目:给定一个数组,求出这个数组中连续子数组的最大乘积,例如{2,3,-4,5},最大乘积为2*3=6。 解析:动态规划思想,保存两个临时变量maxProduct和minProduct,这两个临时变量分别存储,以当前位置结尾的连续子数组的最大乘积和最小乘积。int maxProduct(vector& nums) { int maxRes = nums[0]; int maxPro
2016-06-29 12:09:11 824
原创 STL:set中使用自定义比较操作
set关联容器对关键字类型有一些限制,关键字类型必须定义比较操作,默认情况下,标准库使用关键字类型的<运算符来比较两个关键字。当关键字类型是用户自定义类型时,为了容器中关键字类型正确,我们有三种方式提供正确的关键字类型。 第一中方式:在关键字类型中对#include#includeusing namespace std;class Node{public: int star
2016-06-29 11:57:51 2497
原创 面试中常见链表问题13:回文链表
给定一个单链表,判断该链表是否为回文序列。要求时间复杂度为o(n),空间复杂度为o(1)。 解析:(1)把链表分割成前后两部分。(2)反转前半部分链表。(3)判断前后两部分链表是否相等。bool isPalindrome(ListNode* head) { if (head == NULL || head->next == NULL) return true; ListNode
2016-06-06 16:27:58 353
原创 面试中常见链表问题12:单链表反转(递归)
递归反转单链表。ListNode *reverseList(ListNode *head,ListNode *pNewHead){ if(head == NULL) return pNewHead; ListNode *next = head->next; head->next = pNewHead; return reverseList(next,head);}ListNode
2016-06-06 16:21:21 317
原创 面试中常见链表问题11:在链表中删除给定元素值的节点
给定一个单链表和一个val,删除链表中所有值为val的节点,比如:1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6,val = 6,则返回1 --> 2 --> 3 --> 4 --> 5。ListNode* removeElements(ListNode* head, int val) { if(head == NULL) return head; ListN
2016-06-06 16:08:48 525
原创 面试中常见链表问题10:交叉链表的第一个公共节点
给定两个链表,如果这两个链表相交,则返回第一个相交的顶点,如果不相交,则返回空。比如A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3则返回c1节点。 方法一:(1)求出
2016-06-06 15:58:51 419
原创 面试中常见链表问题9:对单链表进行插入排序
给定一个单链表,对该链表进行插入排序。ListNode* insertionSortList(ListNode* head) { if (head == NULL || head->next == NULL) return head; ListNode *pHead = new ListNode(INT_MAX); pHead->next = head; ListNode *tail
2016-06-06 15:42:57 512
原创 面试中常见链表问题8:重排链表
给定一个单链表:L0->L1->...->Ln-1->Ln,重新排序以后返回L0->Ln->L1->Ln-1->L2->Ln-2...。 解析:(1)把单链表分割为前后两部分。(2)把后一部分链表反转。(3)把两部分链表交叉插入即可。ListNode * reverseList(ListNode *head){ if (head == NULL || head->next == NU
2016-06-06 15:40:05 935
原创 面试中常见链表问题7:反转链表2
给定一个单链表和两个位置m与n,把链表中从m到n位置的元素反转。比如说1->2->3->4->5->NULL,m = 2和n = 4,返回1->4->3->2->5->NULL。ListNode* reverseBetween(ListNode* head, int m, int n) { if (head == NULL || m == n) return head; ListNode
2016-06-06 15:30:00 340
原创 面试中常见链表问题6:划分链表
给定单链表和一个k值,把小于k值节点排在大于等于k值节点之前。比如说1->4->3->2->5->2和 x = 3,则返回1->2->2->4->3->5。ListNode* partition(ListNode* head, int x) { if(head == NULL || head->next == NULL) return head; ListNode *pHeadA = n
2016-06-06 11:33:57 307
原创 面试中常见链表问题5:删除链表中重复元素2
给定一个有序单链表,删除链表中重复元素,比如:1->2->3->3->4->4->5,则返回1->2->5。 解析:设置三个指针,pre、cur和next,当cur->val和next->val不相等时,更新pre = cur、cur = next和next = next->next;当cur->val和next->val相等时,向前移动next指针,直到cur->val和next->v
2016-06-06 10:56:53 272
原创 面试中常见链表问题4:删除链表中重复元素1
给定一个有序的单链表,把链表中重复的元素删除。比如1->1->2->3->3,则返回1->2->3。 代码如下:ListNode* deleteDuplicates(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode *pre = head; ListNode *cur =
2016-06-06 10:28:01 386
原创 面试中常见链表问题3:旋转链表
给定一个单链表和一个k值,把链表向右旋转k步,比如说1->2->3->4->5->NULL和k = 2,则返回4->5->1->2->3->NULL。 解析:(1)把链表分割成两部分,前半部的长度为len-k,后半部分的长度为k,其中len为链表测长度。(2)把后一部分链表的尾指针指向前一部分链表的头指针。返回后一部分的首指针即可。ListNode* rotateRight(ListNode
2016-06-06 10:18:01 277
原创 面试中常见链表问题2:合并k个有序链表
给定k个链表,把这k个链表合并为一个有序的链表。 方法一:(1)每次都需要合并两个有序的链表。(2)把上一次合并后的链表与当前要合并的链表再次合并,直到剩下一个链表为止。此方法时间复杂度太高。//合并两个有序链表ListNode *mergeTwoLists(ListNode *l1,ListNode *l2){ ListNode *head = new ListNode(0);
2016-06-06 09:36:42 481
原创 面试中常见链表问题1:合并两个有序链表
给定两个有序链表,把这两个链表合并为一个有序链表。比如链表1->3->5->NULL和链表2->4->6->NULL。合并以后为1->2->3->4->5->6->NULL。方法一:循环迭代方法ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode *head = new ListNode(0); ListNode *
2016-06-06 09:13:25 912
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人