leetcode 笔记刷题(二)2、两数相加 3、无重复字符最长子串 4、寻找两个正序数组中位数

算法  第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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值