力扣1~5题

题1(简单).

思路:

        因为时间复杂度小于n^2,所以不能双for遍历,怎么优化?

        这里采用一个键值对的形式,存储nums离target的间隔和它的下标,只要n,然后再遍历nums有没有刚好是这个距离的就好了,只要注意两相同的数字这种情况就好了

python3代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        need={}
        for i in range(0,len(nums)):
            a=target-nums[i]
            need[a]=i
        for i in range(0,len(nums)):
            if(need.get(nums[i],'')!='' and need.get(nums[i],'')!=i):
                return [i,need[nums[i]]]

题2(中等):

思路:

无非就是设置一个进位标志就好了,但是呢,这个东西的python,我没看懂它的参数是啥东西,所以用c++,

c++代码

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head;
        ListNode* tail;
        int flag=0;
        for(int i=0;;i++){
            int val1=(l1==NULL)?0:l1->val;
            int val2=(l2==NULL)?0:l2->val;
            int sum=(val1+val2+flag)%10;
            flag=(val1+val2+flag)/10;
            ListNode* newNode=new ListNode(sum);
            if(i==0){
                head=newNode;
                tail=newNode;
            }
            else{
                tail->next=newNode;
                tail=tail->next;
            }
            if(l1!=NULL) {l1=l1->next;}
            if(l2!=NULL) {l2=l2->next;}
            if(l1==NULL&&l2==NULL&&flag==0){
                break;
            }
        
        }
        return head;
            


    }

题3(中等):

思路:

我们可以用一个字符串来接受子串,如果发现有重复字符就统计长度再切割前面的

python3代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n=[]
        ss=''
        for i in range(len(s)):
            if s[i] not in ss:
                ss+=s[i]
            else:
                n.append(len(ss))
                ss=ss.split(s[i])[-1]+s[i]

        n.append(len(ss))

        return max(n)

题4(困难):

思路:

找两数组中位数,这个看起来简单,顺手反应就是数第(m+n)/2个,这个难在要求时间复杂度为log(m+n),所以不能这样搞,我的思路是:每次切割长度为较小长度的一半,然后比较哪个对中位数没有影响就切哪个

python代码

    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        med=None

        while 1:
            if len(nums1) == 0:
                med2 = nums2[(len(nums2)) // 2] if len(nums2) % 2 == 1 else (nums2[len(nums2) // 2 - 1] + nums2[
                    len(nums2) // 2]) / 2
                med = med2
                break
            if len(nums2) == 0:
                med1 = nums1[(len(nums1)) // 2] if len(nums1) % 2 == 1 else (nums1[len(nums1) // 2 - 1] + nums1[
                    len(nums1) // 2]) / 2
                med = med1
                break

            if (len(nums1) + len(nums2) <= 2):
                med = ((nums1[0] if len(nums1) > 0 else 0) + (nums2[0] if len(nums2) > 0 else 0)) / (len(nums1) + len(nums2))
                break

            cutlen=len(nums1)//2 if len(nums1)<=len(nums2) else len(nums2)//2
            if(cutlen<1):
                cutlen=1
            if nums1[cutlen-1]<nums2[cutlen-1]:
                nums1=nums1[cutlen:]
            else:
                nums2=nums2[cutlen:]
            if len(nums1)!=0 and (len(nums2)==0 or nums1[len(nums1)-cutlen]>nums2[len(nums2)-cutlen]) :
                nums1=nums1[:len(nums1)-cutlen]
            else:
                nums2=nums2[:len(nums2)-cutlen]


        return med

题5(中等):

思路:

第一步,统计所有回文可能的起点

python代码:

def longestPalindrome(self, s: str) -> str:

        if len(s)==0 or len(s)==1:

            return s

        #第一步,统计所有回文可能的起点

        p_start=[]

        #p_start里面含有[左值,右值,长度]

        for i in range(len(s)-1):

            if s[i]==s[i+1]:

                p_start.append({'left':i,'right':i+1,'length':2})

            if i-1>=0 and i+1<len(s) and s[i-1]==s[i+1]:

                p_start.append({'left':i-1,'right':i+1,'length':3})

        for p in p_start:

            while 1:

                if p['left']-1>=0 and p['right']+1<len(s) and s[p['left']-1]==s[p['right']+1]:

                    p['left']-=1

                    p['right']+=1

                    p['length']+=2

                else:

                    break

        res_len=0

        res=0

        for i in range(len(p_start)):

            res_len,res=(p_start[i]['length'],i) if p_start[i]['length']>res_len else (res_len,res)

        return s[p_start[res]['left']:p_start[res]['right']+1] if len(p_start)!=0 else s[0]

目描述: 给你两个版本号 version1 和 version2 ,请你比较它们。 版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由多位数字组成,可能包含前导零。每个版本号至少包含一个字符。修订号从左到右编号,下标从0开始,最左边的修订号下标为0 ,下一个修订号下标为1,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。 比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。也就是说,修订号1和修订号001相等。如果版本号没有指定某个下标处的修订号,则该修订号视为0。例如,版本1.0 小于版本1.1,因为它们下标为0的修订号相同,而下标为1的修订号分别为0和1,0 < 1。 返回规则如下: 如果 version1 > version2 返回 1, 如果 version1 < version2 返回 -1, 否则返回 0。 示例 1: 输入:version1 = "1.01", version2 = "1.001" 输出:0 解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1" 示例 2: 输入:version1 = "1.0", version2 = "1.0.0" 输出:0 解释:version1 没有指定下标为 2 的修订号,即视为 "0" 示例 3: 输入:version1 = "0.1", version2 = "1.1" 输出:-1 解释:version1 中下标为 0 的修订号是 0,version2 中下标为 0 的修订号是 1 。0 < 1,所以 version1 < version2 示例 4: 输入:version1 = "1.0.1", version2 = "1" 输出:1 示例 5: 输入:version1 = "7.5.2.4", version2 = "7.5.3" 输出:-1 提示: 1 <= version1.length, version2.length <= 500 version1 和 version2 仅包含数字和 '.' version1 和 version2 都是 有效版本号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值