90. Subsets II

题目

分析:代码如下

 1 class Solution {
 2 public:
 3     vector<vector<int> > subsetsWithDup(vector<int> &S) {
 4         vector<vector<int> > result;
 5         map<vector<int>, bool> m;
 6         int size = S.size();
 7         for(int i = 0; i < pow(2.0, size); i ++)
 8         {
 9             int tag = i;
10             vector<int> cur;
11             for(int j = size-1; j >= 0; j --)
12             {
13                 if(!tag)
14                     break;
15                 if(tag%2 == 1)
16                 {
17                     cur.push_back(S[j]);
18                 }
19                 tag >>= 1;
20             }
21             sort(cur.begin(), cur.end());
22             if(m.find(cur) == m.end()) 
23             {
24                 m[cur] = true;
25                 result.push_back(cur);
26             }
27         }
28         return result;
29     }
30 };

 -----------------------------------------------------------------------------分割线--------------------------------------------------------------------

91. Decode Ways

题目

分析:这道题只需要求解码的种类数,因此一看到这道题目,就条件反射似的想到找递推公式

假设f[i]表示s[0..i]的解码数。在字符串s中,如果s[i]!='0'并且s[i-1]s[i]构成的数大于等于10,小于等于26,则f[i]=f[i-1]+f[i-2]

代码如下:

 1 class Solution {
 2 public:
 3     int numDecodings(string s) {
 4         int len = s.length();
 5         
 6         if(len<=1)
 7         {
 8             if(s[0]=='0')
 9             return 0;
10             else
11             return len;
12         }
13         //如果第一位为0,不可能解码
14         if(s[0]=='0')
15             return 0;
16         
17         int first=1,second=1;
18         int temp,t;
19         
20         for(int i=1;i<len;i++)
21         {
22             t=0;
23             if(s[i] != '0')
24                 t +=second;
25             temp = (s[i-1]-'0')*10+s[i]-'0';
26             //一开始我写成temp>=1,不能通过,再仔细看题目,如果是“01”-->temp = 1这种情况是不能解码的,
27             //因此temp>=10才可以
28             if(temp>=10 &&temp <=26)
29                 t +=first;
30             first = second;
31             second = t;
32         }
33         return second;
34     }
35 };

 --------------------------------------------------------------------------------分割线------------------------------------------------------------------

92. Reverse Linked List II

分析:指针操作,熟练掌握。算法不难,代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* reverseBetween(ListNode* head, int m, int n) {
12         if(NULL == head)
13             return NULL;
14         if(m==n)
15             return head;
16         ListNode *pre,*current,*pHead,*after;
17         pHead = new ListNode(-1);
18         pHead->next = head;    
19         
20         pre = pHead;
21         int i;
22         for(i=0;i<m-1;i++)//定位到第m个节点的前一个节点
23             pre = pre->next;
24         
25         current = pre->next;
26         i++;
27         
28         for(;i<n;i++)
29         {
30             after = current->next;
31             current->next=after->next;
32             after->next = pre->next;
33             pre->next = after;
34             
35         }
36         
37         return pHead->next;
38         
39     }
40 };