Rrui的Leetcode刷题笔记(一)

注:编程语言C++,部分代码参考大佬,地址略。

1.两数之和

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        
        int a=nums.size();
        for (int i=0;i<a;i++)
            for(int j=i+1;j<a;j++)
            {
                
                if (nums[i]+nums[j]==target)
                    return {i,j};        
            }

    }
};

2. 两数相加

/**
 * 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 *d=new ListNode(0);
        ListNode *b=l1;
        ListNode *c=l2;
        ListNode *a=d;
        int jinwei=0;
        while((b!=NULL)||(c!=NULL))
        {
            int x= b!=NULL?b->val:0;
            int y= c!=NULL?c->val:0; 
            int sum=x+y+jinwei;
            jinwei=sum/10;
            //a->val=a->val+sum%10;
            a->next=new ListNode(sum%10);
            a=a->next;
            if (b != NULL) b = b->next;
            if (c != NULL) c = c->next;            
        }
        if (jinwei>0)
        a->next=new ListNode(jinwei);
        return d->next;
    }
};

3. 无重复字符的最长子串

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        
        set<char> a;
        int left=0,right=0,max=0;
        while(right<s.size())
        {
            if(a.find(s[right])==a.end())
            {
                a.insert(s[right++]);
                if (a.size()>max)
                    max=a.size();
            }
            else
                a.erase(s[left++]);
        }
        return max;
    }
};

4.两个排序数组的中位数

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int a=nums1.size();
        int b=nums2.size();
        
        nums1.push_back(INT_MAX);
        nums2.push_back(INT_MAX);  
        
        int c=(a+b)%2==0?1:0;
        
        int*d=new int[a+b];
        int j=0;
        int p=0;
		for (int i = 0; i<a + b; i++)
		{
			if (nums1[j] <= nums2[p])
			{
				d[i] = nums1[j];
				j++;
			}
			else 
			{
				d[i] = nums2[p];
				p++;
			}
        }
        int k=(a+b)/2;
        if(c)
        {
            return (double(d[k])+d[k-1])/2;
        }
        else
            return d[k];
        }
};

5. 最长回文子串

class Solution {
public:
    string longestPalindrome(string s) {
	//寻找最长回文子串
	int size = s.size();
	if (size <= 1) return s;
	//用动态规划方法
	//dp为size*size大小的矩阵,dp[i][j]表示以s[i]开头,s[j]结尾的回文串长度(如果不是回文串,则为0)
	vector<vector<int>> dp(size);
	for (int i = 0; i<size; i++) {
		for (int j = 0; j<size; j++) {
			//初始化,将对角线元素设为1
			if(i==j) dp[i].push_back(1);
			else dp[i].push_back(0);
		}
	}
	int start = 0, max = 1;
	for (int j = 0; j < size;j++){
		for (int i = j - 1; i >= 0; i--) {
			if (s[i] == s[j]) {
				if(j-i==1) dp[i][j] = 2;
				else {
					if (dp[i + 1][j - 1]>0) {
						dp[i][j] = dp[i + 1][j - 1] + 2;
					}
					else dp[i][j] = 0;
				}
			}
			else dp[i][j] = 0;
			if (dp[i][j]>max) {
				max = dp[i][j]; start = i;
			}
		}
	}
	return s.substr(start, max);
    }
};

6.Z字形变换

class Solution {
public:
    string convert(string s, int numRows) {

        if (numRows==1)
            return s;
        int n=s.size();
        int step=2*numRows-2;
        string k;
        
        for(int i=0;i<numRows;i++)
            for(int j=0;j+i<n;j+=step)
            {
                k+=s[i+j];
                if((i<numRows-1)&&(i>0)&&(j + step - i <n))
                {
                    k+=s[j + step - i ];
                }
                
            }
        return k;

    }
};

7. 反转整数

class Solution {
public:
    int reverse(int x) {
        
        int a=0;
        while(x)
        {
            if (a > INT_MAX/10 || a < INT_MIN/10 ) return 0;
            a=10*a+x%10;
            x=x/10;
        }
        return a;
    }
};            

8. 字符串转整数 (atoi)

class Solution {
public:
    int myAtoi(string str) {
        
        int a=str.size();
        long long b=0;
        int kk=0;
        int sign=0;
        int p=0;
        int o=0;
        int u=0;
        
        for(int i=0;i<a;i++)
        {
            if(str[i]==' '&&p==0)
                continue;
            if((str[i]<'0'||str[i]>'9')&&str[i]!='-'&&str[i]!='+')
                break;
            else if(str[i]=='-')
            {
                if(u>0)
                    break;
                kk=1;
                p++;
                sign++;
                continue;
            }

            else if(str[i]=='+')
            {
                if(u>0)
                    break;
                kk=0;
                p++;
                sign++;
                continue;
            }
            else if (sign>1)
                return 0;
            else
            {
                b=10*b+(str[i]-'0');
                u++;
                p++;
                if(b>=2147483648)
                {
                    o=1;
                    break;
                }
            }
        }
        if(kk==1)
        {
            if(o==1)
                b=-2147483648;
            b=-b;
        }
        else
        {
        if(o==1)
            b=2147483648-1;
        }
        return b;
    }
};

9. 回文数

class Solution {
public:
    bool isPalindrome(int x) {
        
        if (x<0)
            return false;
        int k=x;
        int p=0;
        while(k)
        {
            p=10*p+k%10;
            k=k/10;
        }       
        if(p==x)
            return true;
        else return false;      
    }
};

10. 正则表达式匹配

11. 盛最多水的容器

class Solution {
public:
    int maxArea(vector<int>& height) {
        
        int a=height.size();      
        int b=0,c=a-1,max=0;
        
        while(b<c)
        {
            if(((c-b)*min(height[b],height[c]))>max)
                max=(c-b)*min(height[b],height[c]);
            if(height[b]>height[c])
                c--;
            else b++;
        }
        return max;
    }
};

12. 整数转罗马数字

class Solution {
public:
    string intToRoman(int num) {
        
        string a;
        string b[15] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        int c[15] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        
        int i=0;
        while(num)
        {
            if((num-c[i])>=0)
            {
                a+=b[i];
                num=num-c[i];
            }
            else i++;
        }
        return a;
    }
};

13. 罗马数字转整数

class Solution {
public:
    int romanToInt(string s) {
        
        int tagVal[256];  
        tagVal['I'] = 1;  
        tagVal['V'] = 5;  
        tagVal['X'] = 10;  
        tagVal['C'] = 100;  
        tagVal['M'] = 1000;  
        tagVal['L'] = 50;  
        tagVal['D'] = 500;  
        int val = 0;  
        for(int i = 0; i < s.length(); i++){  
            if(i+1 >= s.length() || tagVal[s[i+1]] <= tagVal[s[i]])  
                val += tagVal[s[i]];  
            else  
                val -= tagVal[s[i]];   
        }  
        return val;   
    }
};

14. 最长公共前缀

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        
        if (strs.size() == 0)
        return string();
        else if (strs.size() == 1)
        return strs[0];
        
        string str;
        
        for(int i=0;i<INT_MAX;i++)
        {
            for(int j=1;j<strs.size();j++)
            {
                if(strs[j][i]!=strs[0][i]||i>=strs[0].size())
                {
                    return str;
                } 
            }
            str+=strs[0][i];
        }
        return str;
    }
};

15. 三数之和

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        if(nums.size() < 3)
            return res;
        vector<int> v;
        sort(nums.begin(), nums.end());
        int sum = -1;
        for(int i = 0; i < nums.size() - 2; i++){
            if(nums[i] <= 0){
                v.push_back(nums[i]);
                if(sum == 0 - nums[i]){
                    v.pop_back();
                    continue;
                }
                sum = 0 - nums[i];
                int f = i + 1, l = nums.size() - 1;
                int di = nums[f] - 1;
                while(f < l){
                    if(nums[f] + nums[l] == sum){
                        if(di != nums[f]){
                            v.push_back(nums[f]);
                            v.push_back(nums[l]);
                            res.push_back(v);
                            v.pop_back();
                            v.pop_back();
                            di = nums[f];
                        }
                        f++;l--;
                    }
                    else if(nums[f] + nums[l] < sum)
                        f++;
                    else if(nums[f] + nums[l] > sum)
                        l--;
                }
                v.pop_back();
            }
        }
        return res;
    }
};

16. 最接近的三数之和

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        if(nums.size() <= 3)
        {
            int result = 0;
            for(int i = 0; i < nums.size(); i ++)
            {
                result += nums[i];
            }
            return result;
        }
            
        sort(nums.begin(), nums.end());
        int sum = nums[0] + nums[1] + nums[2];
        for(int i = 0; i < nums.size(); i ++)
        {
            int left = i + 1, right = nums.size() - 1;
            while(left < right)
            {
                int current = nums[left] + nums[right] + nums[i];
                if(abs(target - current) < abs(target - sum))
                {
                    sum = current;
                    if(sum == target)
                        return sum;
                }
                if(current > target)
                    right --;
                else
                    left ++;
            }
        }
        return sum;
    }
};

17. 电话号码的字母组合

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        
        vector<string> a;
        string str;
        vector<string> b;
        char c;
        string s[8] = { "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
        bool k=true;
        
        for(int i=0;i<digits.size();i++)
        {
            if (digits[i]=='0'||digits[i]=='1')
                continue;
            for(int j=0;j<s[digits[i]-'2'].size();j++)
            {
                if(k)
                {
                    str.push_back(s[digits[i]-'2'][j]);
                    a.push_back(str);
                    str.pop_back();
                }
                else               
                    for(int k=0;k<a.size();k++)
                    {
                        str.push_back(s[digits[i]-'2'][j]);
                        b.push_back(a[k]+str);
                        str.pop_back();
                    }
            }
            if(!k)
            {
                a.clear();
                for(int k=0;k<b.size();k++)
                {
                    a.push_back(b[k]);
                }
                b.clear();
            }
            k=false; 
        }
        return a;       
    }
};

18. 四数之和

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        
        int a=nums.size();
        int k,p,sum;
        vector<vector<int>> b;
        vector<int> c;
        
        sort(nums.begin(),nums.end());
            
        for(int i=0;i<a-3;i++)
        {
            for(int j=i+1;j<a-2;j++)
            {
                sum=target-nums[i]-nums[j];
                k=j+1;p=a-1;
                while(k<p)
                {
                    if(nums[k]+nums[p]==sum)
                    {
                         c.push_back(nums[i]);   
                         c.push_back(nums[j]);                               
                         c.push_back(nums[k]);                               
                         c.push_back(nums[p]);   
                         b.push_back(c);                               
                         c.clear(); 
                        k++;
                        p--;
                        while(k<p&&nums[p]==nums[p+1])
                            p--;
                        while(k<p&&nums[k]==nums[k-1])
                            k++;
                    }
                    else if(nums[k]+nums[p]<sum)
                    {
                        k++;
                    }
                    else p--;
                } 
                while(j<a-2&&nums[j]==nums[j+1])
                    j++;
            }
            while(i<a-3&&nums[i]==nums[i+1])
                i++;
        }        
        return b;
    }
};

19. 删除链表的倒数第N个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        
        ListNode *a=head;
        int b,k=0;
        while(a)
        {
            a=a->next;
            k++;
        }
            b=k-1-n;
        if (b<0)
            return head->next;
        ListNode *c=head;
        for(int i=0;i<b;i++)
        {
            c=c->next;
        } 
        c->next= c->next->next;
        return head;
    }
};

20. 有效的括号

class Solution {
public:
	bool isValid(string s) {

		stack <int> stk;
		int a = s.size();
		char b;
        stk.push(NULL);
		for (int i=0; i<a; i++)
		{
			if ((s[i] == '(') || (s[i] == '{') || (s[i] == '['))
				stk.push(s[i]);
			else
			{
				if (stk.top() == NULL)
					return false;
				b = stk.top();
				if (((b == '(') && (s[i] == ')')) || ((b == '{') && (s[i] == '}')) || ((b == '[') && (s[i] == ']')))
				{
					stk.pop();
				}
				else return false;
			}
		}
        if (stk.top() == NULL)
            return true;
        else 
            return false;
	}
};

21. 合并两个有序链表

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode temp_head(0);  //设置临时头节点temp_head
        ListNode *ptr = &temp_head; //使用pre指针指向temp_head
        while(l1&&l2){  //l1和l2不空时,对它们进行比较
            if(l1->val < l2->val){   //如果l1对应的节点小于l2对应的节点
                ptr->next = l1;   //将ptr与较小的节点进行连接
                l1 = l1->next;
            }
            else{
                ptr->next = l2;
                l2 = l2->next;
            }
            ptr = ptr->next;  //ptr指向新连接的节点
        }
        if(l1){  //如果l1有剩余
            ptr->next = l1;   //将l1接到ptr后
        }
        if(l2){
            ptr->next = l2;  //将l2接到ptr后
        }
        return temp_head.next;
    }
};

23. 合并K个排序链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        
        if(lists.size()==0)
            return NULL;
        ListNode*p=lists[0];
        
        for(int i=1;i<lists.size();i++)
        {
            p=mergeTwoLists(p, lists[i]);
        }
        return p;
    }
    
    
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode temp_head(0);  //设置临时头节点temp_head
        ListNode *ptr = &temp_head; //使用pre指针指向temp_head
        while(l1&&l2){  //l1和l2不空时,对它们进行比较
            if(l1->val < l2->val){   //如果l1对应的节点小于l2对应的节点
                ptr->next = l1;   //将ptr与较小的节点进行连接
                l1 = l1->next;
            }
            else{
                ptr->next = l2;
                l2 = l2->next;
            }
            ptr = ptr->next;  //ptr指向新连接的节点
        }
        if(l1){  //如果l1有剩余
            ptr->next = l1;   //将l1接到ptr后
        }
        if(l2){
            ptr->next = l2;  //将l2接到ptr后
        }
        return temp_head.next;
    }
    
};

24. 两两交换链表中的节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {

        if(head==NULL)
            return head;
        
        ListNode* p=head->next;
        if(p&&p->next)
        {
            ListNode* k=p->next;
            p->next=head;            
            head->next=swapPairs(k);
            return p;
        }
        else if(p&&!p->next)
        {
            p->next=head;            
            head->next=NULL;
            return p;
        }
        else return head;
        
    }
};

25. k个一组翻转链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        
        ListNode*p=head,*q,*r; 
        int a=k;
        while(a--)
        {
            if(!p) return head;
            q=p;
            p=p->next;
        }
        q->next=NULL;
        r=reverse(head);        
        head->next=reverseKGroup(p,k);
        return r;
    }

    ListNode* reverse(ListNode* head){
        if(head==nullptr || head->next==nullptr) return head;        
        
        ListNode*p=head;
        ListNode*q=p->next;        
        ListNode*r;
        
        while(q){
            r=q->next;
            q->next=p;
            p=q;
            q=r;
        }
        head->next=NULL;
        return p;
    }    
};

26. 删除排序数组中的重复项

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        
        int a=nums.size();
        int b=0;     
        if(a==0)
            return 0;
        for(int i=1;i<a;i++)
        {
            if (nums[i]!=nums[b])
                nums[++b]=nums[i];
        }
        
        
        return ++b;
    }
};

27. 移除元素

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        
        
        int a=nums.size();
        int b=0;     
        if(a==0)
            return 0;
        for(int i=0;i<a;i++)
        {
            if (nums[i]!=val)
                nums[b++]=nums[i];
        }
        return b;
    }
};

28. 实现strStr()

class Solution {
public:
    int strStr(string haystack, string needle) {
        
        
        int a=haystack.size();
        int b=needle.size();
        if(b==0)
            return 0;
        int k;
        int j;
        for(int i=0;i<a;i++)
        {
            if(haystack[i]==needle[0])
            {
                k=i;
                for(j=0;j<b;j++)
                {
                    if(haystack[k++]!=needle[j])
                        break;
                }
                if(j==b)
                    return i;
            }
        }
        return -1;  
    }
};

31. 下一个排列

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        
        int k=-1,p;
        
        for(int i=nums.size()-1;i>0;i--)
        {
            if(nums[i]>nums[i-1])  
            {
                k=i-1;
                break;
            }
        }
        
        if(k<0)
            reverse(nums.begin(), nums.end());        
        else{
            
            for(int i=nums.size()-1;i>0;i--)
            {
                if(nums[i]>nums[k])  
                {
                    p=i;
                    break;
                }
            }        

            swap(nums[p],nums[k]);

            reverse(nums.begin()+k+1, nums.end());
            
        }

    }
};

35. 搜索插入位置

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        
        int high=nums.size();
        int mid,low=0;
        while(low<high)
        {
            mid=(low+high)/2;
            if(nums[mid]<target)
                low=mid+1;
            else if(nums[mid]>target)
                high=mid;
            else return mid;
        }     
        if(nums[mid]>target)
         return mid;
        else return ++mid; 
    }
};

46. 全排列

class Solution {
public:
     
    void perm(vector<int> num,int k,int n, vector<vector<int> > &res){
        if (k==n){
            res.push_back(num);
        }else{
            for (int i=k;i<=n;i++){
                int tmp = num[k];
                num[k]=num[i];
                num[i]=tmp;
                 
                perm(num,k+1,n,res);
                 
                tmp = num[k];
                num[k]=num[i];
                num[i]=tmp;
            }
        }
    }
 
    vector<vector<int> > permute(vector<int> &num) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<vector<int> > res;
        perm(num,0,(num.size()-1),res);
        return res;
    }
};

47. 全排列 II

class Solution {
public:
    
    
    
    void perm(vector<int> num,int k,int n, vector<vector<int> > &res){
        if (k==n){
            res.push_back(num);
        }else{
            for (int i=k;i<=n;i++){
                int tmp = num[k];
                num[k]=num[i];
                num[i]=tmp;
                 
                perm(num,k+1,n,res);
                 
                tmp = num[k];
                num[k]=num[i];
                num[i]=tmp;
            }
        }
    }
     
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<vector<int> > res;
        perm(nums,0,(nums.size()-1),res);
        
        sort(res.begin(),res.end());
        res.erase(unique(res.begin(),res.end()),res.end());
        
        return res;
        
    }
};

48. 旋转图像

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
        for(int i=0; i<n/2; ++i){
            for(int j=0; j<n; ++j){
                swap(matrix[i][j], matrix[n-1-i][j]);
            }
        }
        
        for(int i=0; i<n; ++i){
            for(int j=0; j<i; ++j){
                swap(matrix[i][j], matrix[j][i]);
            }
        }
    }
};

49. 字母异位词分组

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        
        vector<string> k=strs;
        vector<vector<string>> c;
        
        for(int i=0;i<strs.size();i++)
        {
            sort(k[i].begin(),k[i].end());
        }
        
        vector<string> p=k;
        
        sort(k.begin(),k.end());
        k.erase(unique(k.begin(),k.end()),k.end());
        

        for(int j=0;j<k.size();j++)
        {
            vector<string> b;
            for(int i=0;i<strs.size();i++)
            {
                if(p[i]==k[j])
                    b.push_back(strs[i]);                
            }
            c.push_back(b);
        }
        return c;
    }
};

50. Pow(x, n)

class Solution {
public:
    double myPow(double x, int n) {
        
        if(x==0.0)
            return x;
        if(n==0||x==1.0)
            return 1;
        if(n<0)
        {
            x=1/x;
            if(n<=-2147483647)
                n=-2147483646;
            n=-n;
        }
        return pow(x,n);
    }
    
    double pow(double x, int n)
    {
        if (n==1)
            return x;
        
        double a=1;
        if(n%2==1)
        {
            n--;
            a=pow(x,n/2);
            a=a*a*x;            
        }
        else
        {
            a=pow(x,n/2);
            a*=a;
        }
        return a;
    }
};

猜你喜欢

转载自blog.csdn.net/Rrui7739/article/details/82787950
今日推荐