算法 第2题:两数相加
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *root = new ListNode(0);
ListNode *cursor = root;
int carry = 0;
while(l1 != NULL || l2 != NULL || carry != 0) {
int l1Val = l1 != NULL ? l1->val : 0;
int l2Val = l2 != NULL ? l2->val : 0;
int sumVal = l1Val + l2Val + carry;
carry = sumVal / 10;
ListNode *sumNode = new ListNode(sumVal % 10);
cursor->next = sumNode;
cursor = sumNode;
if(l1 != NULL) l1 = l1->next;
if(l2 != NULL) l2 = l2->next;
}
return root->next;
}
};
/*打印链表*/
void printList(ListNode* head)
{
ListNode* phead=head;
while(phead!=NULL)
{
cout<<phead->val<<" ";
phead=phead->next;
}
cout<<"\n";
}
int main()
{
int a[3] = {2,4,3};
int b[5] = {5,6,4};
ListNode *La= new ListNode(a[0]);
ListNode *Lb= new ListNode(b[0]);
ListNode* phead=La;
ListNode* phead1=Lb;
for(int i = 1; i < 3; i++)
{
ListNode* newnode = new ListNode(a[i]);
phead->next = newnode;//并将其赋值给La
phead = newnode;
ListNode* newnode1 = new ListNode(b[i]);
phead1->next = newnode1;//并将其赋值给Lb
phead1 = newnode1;
}
Solution sln;
printList(La);
printList(Lb);
ListNode* Lc = sln.addTwoNumbers(La, Lb);
printList(Lc);
return 0;
}
算法 第3题 无重复字符的最长子串
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int a = 0, b = 0, len = s.size(), ans = 1;
int mp[130] = {0};
if(len <= 1){
return len;
}
while(b < len){
char tem = s[b];
if(mp[tem]){
ans = max(ans, b - a);
int i = a, j = mp[tem];
a = mp[tem];
for(; i < j; i++){
mp[s[i]] = 0;
}
}
mp[tem] = b+++1;
}
return max(ans, b - a);
}
};
/*
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
//s[start,end) 前面包含 后面不包含
int start(0), end(0), length(0), result(0);
int sSize = int(s.size());
vector<int> vec(128, -1);
while (end < sSize)
{
char tmpChar = s[end];
//仅当s[start,end) 中存在s[end]时更新start
if (vec[int(tmpChar)] >= start)
{
start = vec[int(tmpChar)] + 1;
length = end - start;
}
vec[int(tmpChar)] = end;
end++;
length++;
result = max(result, length);
}
return result;
}
};
*/
int main()
{
string input="abcabcbb";
Solution sln;
int ret = sln.lengthOfLongestSubstring(input);
cout << ret << endl;
return 0;
}
算法 第4题 寻找两个正序数组的中位数
#include <iostream>
#include <vector>
using namespace std;
/*
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
int median_index = (m + n)/2;
double median = 0.0;
//涉及到排序,可以不用排完,只排到需要的位置就可以了(没有使用)
//判断总数的奇偶
//排序
int index = 0;
int index1 = 0;
int index2 = 0;
vector<int> merge(nums1);
merge.resize(m+n);
while(index1 < m && index2 < n)
{
merge[index++] = nums1[index1] < nums2[index2] ? nums1[index1++]:nums2[index2++];
}
while(index1 < m)
{
merge[index++] = nums1[index1++];
}
while(index2 < n)
{
merge[index++] = nums2[index2++];
}
if((m + n) % 2 == 0) // 偶数
{
median = (merge[median_index] + merge[median_index - 1]) / 2.0;
}
else // 奇数
{
median = merge[median_index];
}
return median;
}
};
*/
/*
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int total = nums1.size() + nums2.size();
if (total % 2 == 0) {
int l = findKthMaxNunmber(nums1, 0, nums2, 0, total / 2);
int r = findKthMaxNunmber(nums1, 0, nums2, 0, total / 2 + 1);
return (double)(l + r) / 2.0;
} else {
return findKthMaxNunmber(nums1, 0, nums2, 0, total / 2 + 1);
}
return 0;
}
// 找到第k大数
int findKthMaxNunmber(vector<int>& nums1, int i, vector<int> &nums2, int j, int k) {
if (k == 1) {
if (i != nums1.size() && j != nums2.size()) return min(nums1[i], nums2[j]);
else if (i != nums1.size()) return nums1[i];
else return nums2[j];
} else {
if (i != nums1.size() && j != nums2.size()) {
if (nums1[i] < nums2[j]) {
return findKthMaxNunmber(nums1, i+1, nums2, j, k-1);
} else {
return findKthMaxNunmber(nums1, i, nums2, j+1, k-1);
}
} else if (i != nums1.size()) {
return findKthMaxNunmber(nums1, i+1, nums2, j, k-1);
} else {
return findKthMaxNunmber(nums1, i, nums2, j+1, k-1);
}
}
}
};
*/
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size()) {
return findMedianSortedArrays(nums2, nums1);
}
int m = nums1.size();
int n = nums2.size();
int left = 0, right = m, ansi = -1;
// median1:前一部分的最大值
// median2:后一部分的最小值
int median1 = 0, median2 = 0;
while (left <= right) {
// 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
// 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
int i = (left + right) / 2;
int j = (m + n + 1) / 2 - i;
// nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
int nums_im1 = (i == 0 ? INT_MIN : nums1[i - 1]);
int nums_i = (i == m ? INT_MAX : nums1[i]);
int nums_jm1 = (j == 0 ? INT_MIN : nums2[j - 1]);
int nums_j = (j == n ? INT_MAX : nums2[j]);
if (nums_im1 <= nums_j) {
ansi = i;
median1 = max(nums_im1, nums_jm1);
median2 = min(nums_i, nums_j);
left = i + 1;
}
else {
right = i - 1;
}
}
return (m + n) % 2 == 0 ? (median1 + median2) / 2.0 : median1;
}
};
int main()
{
int a[] = {1, 3};
int b[] = {2, 4};
vector<int> nums1(a, a+2);
vector<int> nums2(b, b+2);
double median = 0.0;
Solution sln;
median = sln.findMedianSortedArrays(nums1, nums2);
cout << "median: " << median << endl;
return 0;
}