167.两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int in1 = 0,in2 = numbers.size() - 1;
for(;;){
if(numbers[in1] + numbers[in2] > target)
in2--;
else if(numbers[in1] + numbers[in2] < target)
in1++;
else if(numbers[in1] + numbers[in2] == target)
break;
}
return vector<int>{in1 + 1,in2 + 1};
}
};
命两指针从两边开始遍历求和,直到找到题解
88.合并两个有序数组
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int pos = m-- + n-- - 1;
for(;;){
if(m < 0||n < 0)
break;
if(nums2[n] >= nums1[m])
nums1[pos--] = nums2[n--];
else
nums1[pos--] = nums1[m--];
}
while(n >= 0){
nums1[pos--] = nums2[n--];
}
}
};
命两指针从尾部开始插入数据。因为题目要求不能开辟新空间来使用,就必须只能在原来提供的两个数组里进行相关操作
142.环形链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
do{
if(!fast || !fast->next)
return nullptr;
fast = fast->next->next;
slow = slow->next;
}while(fast != slow);
fast = head;
while(fast != slow){
fast = fast->next;
slow = slow->next;
}
return fast;
}
};
对于此题,需要使用到快慢指针法:
1)命两指针 fast 与 slow,前者每次走两步,后者每次走一步。如果fast指针一直走不到尽头则说明链表中无环。
2)反之,如果两指针相遇,说明链表中存环。这时将fast指针重新移至开头,速度并降至一次一步。下次与slow相遇的地点就是环的开头
76.最小覆盖子串
class Solution {
public:
string minWindow(string s, string t) {
vector<int>chars(128,0);
vector<bool>flag(128,false);
if(t.empty() || s.empty())
return "";
int size1 = t.size();
int size2 = s.size();
for(int i = 0;i < size1;i++ ){
flag[t[i]] = 1;//标记字母是否出现
chars[t[i]]++;//标记字母出现次数
}
int cnt = 0;//记录t在s中的出现情况
int l = 0;
int minl = 0;
int minsize = size2 + 1;
for(int i = 0;i < size2;i++){
if(flag[s[i]])
if(--chars[s[i]] >= 0)//if(flag[s[i]] && chars[s[i]]) cnt++;chars[s[i]]--;
cnt++;
while(cnt == size1){//当记录中子串满足覆盖条件后,开始缩小区间
if(i - l + 1 < minsize){//i - l是窗口区间
minl = l;
minsize = i - l + 1;
}
if(flag[s[l]] && ++chars[s[l]] > 0 ){
cnt--;
}
l++;
}
}
if(minsize > size2)
return "";
else
return s.substr(minl,minsize);
}
};
注意返回空字符串的形式是""