力扣刷题记录(1)

力扣刷题记录


本系列文章仅做为小白刷题记录使用


前言

23春招惨烈,由于本身代码基础较弱,没有接触过ACM训练,于是对该类笔试胆战心惊,刷题只为提升代码水平。从最基础的题型和简单模式开始。9.25-10.02


一、两数之和

题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个
整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。
https://leetcode.cn/problems/two-sum/description/
在这里插入图片描述

本人思路:暴力求解

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        sorted(nums)
        anser=[]
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if (nums[i]+nums[j])==target:
                    anser.append(i)
                    anser.append(j)
                    return anser
                

优质解答:利用了Python列表本身的特性,提高了寻找速度。

 # 遍历列表
        for i in range(len(nums)):
            # 计算需要找到的下一个目标数字
            res = target-nums[i]
                # 遍历剩下的元素,查找是否存在该数字
            if res in nums[i+1:]:
                # 若存在,返回答案。这里由于是两数之和,可采用.index()方法
                # 获得目标元素在nums[i+1:]这个子数组中的索引后,还需加上i+1才是该元素在nums中的索引
                return [i, nums[i+1:].index(res)+i+1]

作者:从前的我——再次回归
链接:https://leetcode.cn/problems/two-sum/solutions/1463966/jian-dan-python-by-chanemo-muld/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
                

二、字母异位

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

https://leetcode.cn/problems/group-anagrams/description/?envType=study-plan-v2&envId=top-100-liked
在这里插入图片描述

def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        l=len(strs)
        temp={}
        for i in range(l):
            b=strs[i]
            a=''.join(sorted(b))
            if a in temp: 
                temp[a].append(b)
            else:temp[a]=[b]
        return list(temp.values())

两个容易遗忘的点:1.在向答案字典序列添加成员时,添加的是列表成员,才可以使用append;2.在对字符串顺序排序以后,需要将其转换为字符串

三、最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
https://leetcode.cn/problems/longest-consecutive-sequence/description/?envType=study-plan-v2&envId=top-100-liked
在这里插入图片描述

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        maxl=0;
        number=set(nums)
        for num in nums:
            #查找前一个数是否在数列中
            if(num-1 not in number):
                #如果不在,当前序列的长度则为1,当前数字是首位
                lenth=1
                #查找当前数字的后序数字
                while (num+1) in number:
                    lenth=lenth+1
                    num+=1
                maxl=max(maxl,lenth)
        return maxl

四、合并连个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。https://leetcode.cn/problems/merge-sorted-array/description/
在这里插入图片描述

//本题使用c更清晰好些一些;使用三指针尾插法,同时移动指针可加快合并速度,遍历一次即可完成
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
   int j=n-1, index=m+n-1,i=m-1;
    while(i>-1&&j>-1)
        {
          if(nums1[i]<nums2[j])
            {
                nums1[index]=nums2[j];
                j--;
                index--;
            }
            else 
            {
                nums1[index]=nums1[i];
                i--;
                index--;
            }}
            while(i>=0)nums1[index--]=nums1[i--];
            while(j>=0)nums1[index--]=nums2[j--];
            
            }

Python题解:在评论区看到的是直接复制数组nums2之后,使用sort函数,经大佬分析sort以后仍然满足时间限制。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        nums1[m:] = nums2
        nums1.sort()
        return 

作者:_G_
链接:https://leetcode.cn/problems/merge-sorted-array/solutions/2385510/shu-zu-zhi-jie-he-bing-hou-pai-xu-by-adm-8405/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

五、将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/
在这里插入图片描述

经典递归思路:保证构造出来的树左右都是平衡二叉树,就要保证每一棵子树均为平衡二叉树。每次使用中间的元素作为根节点(题目表示已经升序),则在构造完成后能返回一棵平衡二叉树。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return created(nums,0,nums.size()-1);

    }

    TreeNode* created(vector<int>& nums,int left ,int right)
    {
        if(left>right){
            return nullptr;
        }
        int mid=(left+right)/2;
        TreeNode* root=new TreeNode(nums[mid]);
        root->left=created(nums,left,mid-1);
        root->right=created(nums,mid+1,right);
        return root;
    }
};
评论区的简洁写法:
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
    if (NULL == nums || numsSize == 0) return NULL;

    int middle = numsSize / 2;
    struct TreeNode *ret = malloc(sizeof(struct TreeNode));
    ret->val = nums[middle];
    ret->left = sortedArrayToBST(nums, middle);
    ret->right = sortedArrayToBST(nums + middle + 1, numsSize - middle - 1);

    return ret;
}

六、杨辉三角

除了第一行,其余每行的第一个和最后一个元素均为1,并且每行的元素个数是元素
行号+1,得出当前元素值与上一行元素位置的关系后,两层循环可求出。

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> anser(numRows);
            for(int i=0;i<numRows;i++){
                anser[i].resize(i+1);
                anser[i][0]=1;
                for(int j=1;j<i;j++)
                    anser[i][j]=anser[i-1][j-1]+anser[i-1][j];            
                    anser[i][i]=1;
                }
                
        return anser;
        
    }
};
评论区用动态规划的大佬写的代码:
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> dp(numRows);
        if (numRows >= 1) dp[0].emplace_back(1);
        if (numRows >= 2) {
            dp[1].emplace_back(1);
            dp[1].emplace_back(1);
        }
        for (int i = 2; i < numRows; ++i) {
            dp[i].emplace_back(1);
            for (int j = 1; j <= i - 1; ++j) {
                dp[i].emplace_back(dp[i - 1][j] + dp[i - 1][j - 1]);
            }
            dp[i].emplace_back(1);
        }
        return dp;
    }
};

作者:不想再打铁
链接:https://leetcode.cn/problems/pascals-triangle/solutions/2083039/dong-tai-gui-hua-qing-song-qiu-chu-by-ki-tsqr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

七、杨辉三角 II

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。https://leetcode.cn/problems/pascals-triangle-ii/

class Solution {
public:
    vector<int> getRow(int rowIndex) {
    vector<vector<int>> anser(rowIndex+1);
            for(int i=0;i<rowIndex+1;i++){
                anser[i].resize(i+1);
                anser[i][0]=1;
                for(int j=1;j<i;j++)
                    anser[i][j]=anser[i-1][j-1]+anser[i-1][j];            
                    anser[i][i]=1;
                }
                
        return anser[rowIndex];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值