【力扣数据结构入门(c++)】(自学)

本文介绍了如何使用暴力排序、哈希表以及动态规划算法来解决整数数组中是否存在重复元素的问题,同时探讨了如何找到具有最大和的连续子数组。两种方法对比,展示了在不同场景下的时间复杂性和空间复杂度优化。

(简单)存在重复元素 217

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
1、暴力排序

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        sort(nums.begin(), nums.end()); //先将数组进行排序
        int n=nums.size(); //记录数组长度
        for(int i=0; i<n-1; i++)
        {
            if(nums[i]==nums[i+1])    //判断相邻元素是否相同,相同返回true,否则返回false
            {
                return true;
            } 
        }
        return false;
    }
    
};

复杂度分析

时间复杂度:O(NlogN),其中 NN 为数组的长度。需要对数组进行排序。

空间复杂度:O(logN),其中 NN 为数组的长度。注意我们在这里应当考虑递归调用栈的深度。

2、哈希表
对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s;
        for (int x: nums) {
            if (s.find(x) != s.end()) {
                return true;
            }
            s.insert(x);
        }
        return false;
    }
};

复杂度分析

时间复杂度:O(N),其中 N为数组的长度。

空间复杂度:O(N)

最大子数组和 53

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

1、动态规划

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxAns=nums[0], pre=0;
        for(const auto &x: nums)
        {
            pre = max(pre + x, x);
            maxAns = max(maxAns, pre);
        }
        return maxAns;
    }
};

从下标0到n-1,f(i)=max{f(i−1)+nums[i],nums[i]},分别对比之前的和当前最大,最后返回最大

参考提供的内容未提及力扣hoot100文档C++相关内容。不过一般来说,在力扣平台上hoot100的C++代码可以通过以下途径查找: 1. **力扣官网**:在力扣官网搜索hoot100相关题目,在题目页面通常会有用户提交的C++代码解答,并且可以查看不同的题解思路和代码实现。 2. **GitHub**:许多开发者会将自己的力扣题解上传到GitHub上,在GitHub搜索“力扣hoot100 C++”,可以找到相关的代码仓库。 以下是一个简单的C++代码示例,假设是解决一个基础的二叉树遍历问题(以二叉树的前序遍历为例): ```cpp #include <iostream> #include <vector> // 定义二叉树节点结构 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 前序遍历函数 void preorderTraversal(TreeNode* root, std::vector<int>& result) { if (root == nullptr) return; result.push_back(root->val); preorderTraversal(root->left, result); preorderTraversal(root->right, result); } // 调用前序遍历函数并返回结果 std::vector<int> preorderTraversal(TreeNode* root) { std::vector<int> result; preorderTraversal(root, result); return result; } int main() { // 简单创建一个二叉树 TreeNode* root = new TreeNode(1); root->right = new TreeNode(2); root->right->left = new TreeNode(3); // 调用前序遍历函数 std::vector<int> result = preorderTraversal(root); // 输出结果 for (int val : result) { std::cout << val << " "; } std::cout << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值