leetcode4.25

1、46全排列——递归

class Solution {
public:
    vector<vector<int>>result;
    void func(vector<int>& nums, vector<int>& current, vector<bool>visit)
    {
        int len = nums.size();
        if (current.size() == len)
        {
            result.push_back(current);
        }
        else
        {
            for (int i = 0; i < len; i++)
            {
                if (visit[i])
                {
                    current.push_back(nums[i]);
                    visit[i] = false;
                    func(nums, current, visit);
                    visit[i] = true;
                    current.pop_back();
                }
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        if (nums.size() == 0)return {};
        if (nums.size() == 1)return { nums };
        int len = nums.size();
        vector<int>current;
        vector<bool>visit(len, true);
        func(nums, current, visit);
        return result;
    }
};

2、21合并两个升序链表——递归

struct ListNode {

	int val;
	ListNode* next;
	ListNode(int x) : val(x), next(NULL) {}
};

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;
		}
		else
		{
			L2->next = mergeTwoLists(L1, L2->next);
			return L2;
		}
	}
};
3、26.删除排序数组中的重复项
```cpp
class Solution
{
public:
	int removeDuplicates(vector<int>& nums)
	{
		int ret = nums.size();
		if (ret < 2)return ret;
		int cout = 0;
		for (int i = 0; i < ret; i++)
		{
			if (nums[i] != nums[cout])
			{
				cout++;
				nums[cout] = nums[i];
			}
		}
		nums.resize(cout + 1);
		return cout + 1;
	}
};

4、27.移除元素——原地修改通常考虑重新设置计数指针对数组进行原地覆盖

//1法
class Solution

{
public:
	int removeElement(vector<int>& nums, int val)
	{
		for (int i = 0; i < nums.size(); i++)
		{
			if (nums[i] == val)
			{
				nums.erase(nums.begin() + i);
				i--;
			}
		}
		return nums.size();
	}
};
//2法
class Solution
{
public:

	int removeElement(vector<int>& nums, int val)
	{
		int ret = nums.size();
		int j = 0;
		for (int i = 0; i < ret; i++)
		{
			if (nums[i] != val)
			{
				nums[j] = nums[i];
				j++;
			}
		}
		nums.reserve(j);
		return j;
	}

};

5、35搜素插入位置————有序表的二分法查找位置

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

};

6、53最大子序和

//动态规划的方法
class Solution

{

public:

        int maxSubArray(vector<int>& nums)

        {

               int len = nums.size();

               vector<int> v(len,0);

               v[0] = nums[0];

               int maxsum = v[0];

               for (int i = 1; i < len; i++)

               {

                       v[i] = max(v[i - 1] + nums[i], nums[i]);

                       if (v[i] > maxsum)maxsum = v[i];

               }

               return maxsum;

        }

};
//贪心法解题
class Solution

{

public:

        int maxSubArray(vector<int>& nums)

        {

               int len = nums.size();

               int maxsum = 0, temp = 0;

               for (int i = 0; i < len; i++)

               {

                       temp += nums[i];

                       if (temp > maxsum)maxsum = temp;

                       if (temp < 0)temp = 0;

               }

               return maxsum;

        }

};


int main()

{

        vector<int>v1 = { -2,1,-3,4,-1,2,1,-5,4 };

        Solution c;

        cout << c.maxSubArray(v1);

        return 0;

}

7、70爬楼梯

//递归
class Solution {
public:
    int climbStairs(int n) {
        if (n == 1)return 1;
        if (n == 2)return 2;
        return climbStairs(n - 1) + climbStairs(n - 2);

    }
};
//动态规划
class Solution

{

public:

        int climbStairs(int n)

        {

               int temp1 = 1;

               int temp2 = 2;

               int result;

               if (n < 3)return n;

               for (int i = 3; i < n + 1; i++)

               {

                       result=temp1+temp2;

                       temp1 = temp2;

                       temp2 = result;

               }

               return result;

        }

8、83删除有序链表中重复元素

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head == nullptr)return head;
        ListNode* p = head;
        while (p->next != nullptr)
        {
            ListNode* q = p->next;
            if (p->val == q->val)
            {
                p->next = q->next;
                delete q;
            }
            else
            {
                p = p -> next;
            }
        }
        return head;

    }
};
posted @ 2020-04-25 17:09  凌丨云  阅读(134)  评论(0)    收藏  举报