自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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关注的人

提示
确定要删除当前文章?
取消 删除