一:leetcode41 First Missing Positive
题目:
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0]
return 3
,
and [3,4,-1,1]
return 2
.
Your algorithm should run in O(n) time and uses constant space.
分析:此题关键O(n)和常量空间的限制。常量空间的话第一可以考虑是不是固定数量的几个变量能搞定;否则可以考虑是不是问题本身已经提供了足够的空间。当然这里O(1)就可以解决。
class Solution { public: int firstMissingPositive(int A[], int n) { for(int i = 0; i < n; i++){ while(A[i] > 0 && A[i] <= n && A[A[i]-1] != A[i]){ // 比如1 2 5 6 7 此时的A[2]的5就需要与A[4]交换 swap(A[i], A[A[i]-1]);//// 注意条件是让别人正确,不是自己位置A[i]!=i+1 否则如[1 1]就会陷入死循环 } } for(int i = 0; i < n; i++) if(A[i] != i+1) return i+1; return n+1; } };
很多人认为这不是O(N)时间,其实虽然当条件满足,i没有++,但是此时可以是A[A[i]-1]的值变成了A[i],当循环到下标A[i]-1,条件肯定不满足,故还是O(N)时间。当然了本问题没有必要限制数据不重复。。。It is amazing!!
二:LeetCode19 Remove Nth Node From End of List
题目:
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.分析:这题给出两种方法,方法一需要额外的空间复杂度O(N),,方法二是双指针的思想,关键在于很难想到啊
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /*class Solution { public: ListNode *removeNthFromEnd(ListNode *head, int n) { // 需要空间复杂度O(N) ListNode *p = head; while(p != NULL){ vec.push_back(p); p = p->next; } int len = vec.size(); if(n == len) head = head->next; else vec[len-n-1]->next = vec[len-n]->next; return head; } private: vector<ListNode*> vec; };*/ class Solution { public: ListNode *removeNthFromEnd(ListNode *head, int n) { ListNode *front= head, *behind=head; while(front != NULL){ front = front->next; if(n-- < 0) behind = behind->next; } if(n >= 0)head = head->next; else behind->next = behind->next->next; return head; } };