leetcode_刷题笔记

217 存在重复元素

1.使用双指针来做
可以实现但是不用说也可以直接看到,效率太低了

class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int length = nums.size();
for(int i=0;i<length-1;i++)
{
for(int j=i+1;j<length;j++)
{
if(nums[i]==nums[j])
{
return true;
}
}
}
return false;
}

 

第二想到的,就是直接进行两两比对,但是必须考虑一个问题,这仅仅考虑了间隔一的大小,没有考虑间隔多的比较,所以我们只需要将全部的可能压缩在间隔1就可以用for遍历
想法到位,直接写就好了,这里注意下数组的越界问题。

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        int length = nums.size();
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size()-1;i++)
        {
            if(nums[i]==nums[i+1])
            {
                return true;
            }
        }
        return false;
    }
};

leetcode 53 最大子序和

动态规划问题:设计状态思路:把不确定的因素确定下来,进而把子问题定义清楚,把子问题定义得简单。动态规划的思想通过解决了一个一个简单的问题,进而把简单的问题的解组成了复杂的问题的解。

因为我们把子问题定义的更清楚,子问题之间的联系就容易观察到。这是我们定义子问题、定义状态的经验。
所以重点在于如何去合理的定义我们的子问题。只有把子问题定义清楚,才可以找到内部联系,才可以去构建我们的动态规划方程
dp[i]:表示以 nums[i] 结尾 的 连续 子数组的最大和。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        #init状态
        size = len(nums)
        dp = [0 for i in range(size)]
        dp[0] = nums[0]
        #状态转移方程
        for i in range(1,size):
            if(dp[i-1]>=0):
                dp[i] = dp[i-1] + nums[i]
            else:
                dp[i] = nums[i]
        #给出题解
        return max(dp)

 

 leetcode 136 只出现一次的数字

还是使用数组指针思想,先把数组进行排序,让相同的元素在自己的旁边,然后让指针每一次轮回跳跃2进行相等检测就可以了。

sort(nums.begin(), nums.end());
    for (int i = 0; i < nums.size();)
    {
        if (i == nums.size()-1)
        {
            cout << nums[i];
            break;
        }
        if (nums[i] == nums[i + 1])
        {
            i = i + 2;
            continue;
        }
        else
        {
            cout << nums[i];
            break;
        }

 


方法:使用位运算
数组中的全部元素的异或运算结果即为数组中只出现一次的数字
原理:任何数和0做异或运算,结果仍然是原来的数
任何数和其自身做异或运算,结果是 0。
这个是真的牛!

class Solution {
public:
    int singleNumber(vector<int>& nums) {
       int res = nums[0];
       for(int i=1;i<nums.size();i++)
       {
           res = res^nums[i];
       }
       return res;
    }
};


多数元素 leetcode 169

这里明显应该采用键值对的方式去存储数字与数字出现的次数
所以在c++中我们通过哈希表去实现这个操作。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map<int,int> count;
        int res=0;
        for(int num:nums)
        {
            count[num]++;
            if(count[num]>nums.size()/2)
            {
                res = num;
            }  
        } 
        return res;       
    }
};

 

 

posted @ 2021-10-16 16:26  Lzwhehe  阅读(40)  评论(0)    收藏  举报