016. 最接近的三数之和
LeetCode链接:https://leetcode-cn.com/problems/3sum-closest/
思路:
暴力算法:直接三个数求和存入一个数组中,再让数组每一个元素与target相减,找到最小的数,最后返回最小的数加上target就是所求。时间复杂度是O(N^3),会TLE。
上代码:C++
class Solution
{
public:
int threeSumClosest(vector<int> &nums, int target)
{
vector<int> ThreeSum;
for (int i = 0; i < nums.size()-2; i++)
{
for (int j = i + 1; j < nums.size()-1; j++)
{
for (int k = j + 1; k < nums.size(); k++)
{
ThreeSum.push_back(nums[i] + nums[j] + nums[k]-target);
}
}
}
int min=INT_MAX;
for(int i=0;i<ThreeSum.size();i++){
if(abs(min)>abs(ThreeSum[i]))
min=ThreeSum[i];
}
return min+target;
}
};
双指针法,先排序,再定义left和right指针,外层使用for循环定义i是第一位数组,left=i+1,right=最后一位。利用while循环,找到最小的。时间复杂度为O(N^2)。
上代码:C++
class Solution
{
public:
int threeSumClosest(vector<int> &nums, int target)
{
sort(nums.begin(), nums.end());
int result = nums[0] + nums[1] + nums[2];
int min = INT_MAX;
for (int i = 0; i < nums.size() - 2; i++)
{
int left = i + 1;
int right = nums.size() - 1;
while (left < right)
{
int ThreeSum = nums[i] + nums[left] + nums[right];
if (abs(ThreeSum - target) < abs(result - target))
result = ThreeSum;
if (ThreeSum - target == 0)
return target;
else if (ThreeSum < target)
left++;
else
right--;
}
}
return result;
}
};
020.有效的括号
LeetCode链接:https://leetcode-cn.com/problems/valid-parentheses/
思路:
利用栈,栈先入后出,正好利用这个,如果出现’(’、’[’、’{’,则在栈压入’)’、’]’、’}’。当出现反括号即’)’、’]’、’}'后,将栈顶元素与字符串中的括号比较,不同则返回假。最后查看栈中是否为空,为空则返回真,否则,返回假。我是通过switch实现的。
上代码:C++
class Solution
{
public:
bool isValid(string s)
{
stack<char> temp;
for (char &ch : s)
{
switch (ch)
{
case '(':
temp.push(')');
break;
case '[':
temp.push(']');
break;
case '{':
temp.push('}');
break;
case ')':
if (temp.empty() || temp.top() != ch)
return false;
else
temp.pop();
break;
case ']':
if (temp.empty() || temp.top() != ch)
return false;
else
temp.pop();
break;
case '}':
if (temp.empty() || temp.top() != ch)
return false;
else
temp.pop();
break;
default:;
}
}
return temp.empty();
}
};
021.合并两个有序链表
LeetCode链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/
思路:
利用递归,直接看代码吧,代码简单。l1==nullptr或者l2=nullptr是递归出口。
上代码:C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution
{
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
{
if (l1 == nullptr)
return l2;
if (l2 == nullptr)
return l1;
if (l1->val <= l2->val)
{
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
if (l1->val > l2->val)
{
l2->next = mergeTwoLists(l2->next, l1);
return l2;
}
return nullptr;
}
};