leetcodeday26 –删除有序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按升序排列
#
# @lc app=leetcode.cn id=26 lang=python3
#
# [26] 删除有序数组中的重复项
#

# @lc code=start
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        nums.append(10**4+1)
        j=0
        for i in range(len(nums)-1):
            if nums[i]==nums[i+1]:
                continue
            else:
                nums[j]=nums[i]
                j=j+1
        return j
# @lc code=end

leetcodeday32 —最长有效括号

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i] 为 '(' 或 ')'

思路:记录每个打破成对括号规则的位置,那么最长的符合要求的长度就在这些位置之间 。


# @lc code=start
class Solution:
    def longestValidParentheses(self,s: str) -> int:
        if s=="":
            return 0
        length = len(s)
        rev,div=list(),list()
        i=0
        lens=0
        result=0
        while i<=length-1:
            lens=len(rev)
            if s[i]=="(": 
                rev.append(s[i])
                div.append(i)
                

            elif lens!=0 and s[i]==")": 
                rev.pop()
                #result=mid if mid  >=result else result
                div.pop()
                
            else:
                div.append(i)
                #result=mid if mid  >=result else result
            i=i+1   

        
        res=list()
        if div.count(length)==0:
            div.append(length)
        res.append(div[0])
        if len(div)>1:
            for i in range(1,len(div)):
                res.append(div[i]-div[i-1]-1)

        return max(res) if max(res)>result else result
            

leetcodeday31 –下一个排列

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须 原地 修改,只允许使用额外常数空间。

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]

示例 4:

输入:nums = [1]
输出:[1]

第一次做法:思路,找到 需要交换的nums[i] 和nums[j],交换后,对nums[i+1:]进行排序即可

# @lc code=start



class Solution:
    def InsertSort(self,lst):
        n=len(lst)
        if n<=1:
            return lst
        for i in range(1,n):
            j=i
            target=lst[i]            #每次循环的一个待插入的数
            while j>0 and target<lst[j-1]:       #比较、后移,给target腾位置
                lst[j]=lst[j-1]
                j=j-1
            lst[j]=target            #把target插到空位
        return lst
    
    def nextPermutation(self,nums) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
            
        m=j=len(nums)-1
        x=-1
        for i in range(len(nums)-2,-1,-1):
            re=100
            l=j
            for h in range(j,m+1):
              
              if 0<nums[h]-nums[i]<re:
                  l=h
                  re=nums[h]-nums[i]
            print(l)
            
            if nums[i]<nums[l]:
                rev=nums[l]
                nums[l]=nums[i]
                nums[i+1:]=self.InsertSort(nums[i+1:])
                nums[i]=rev
                return nums
            else: 
                j=j-1
        n=0
        while n<m:
            rev=nums[m]
            nums[m]=nums[n]
            nums[n]=rev
            n+=1
            m-=1
        return nums

听歌

何必管一片海
有多么澎湃
何必管那山岗
它高在什么地方
只愿这颗跳动不停的心
永远有慈爱
好让这世间冰冷的胸膛
如盛开的暖阳
旅人等在那里
虔诚仰望着云开
咏唱回荡那里
伴着寂寞的旅程
心中这一只鹰
在哪里翱翔
心中这一朵花
它开在那片草原

leetcodeday29 –两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2

提示:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

思路:

一开始打算用 减法实现,但会超时,因为每次都是dividend-divisor,步子很小,导致对于一个大数-小数,很耗时,因此采用 步长每次*2,每次都是 dividend-divisor , divisor =2* divisor,如果 dividend-2divisor <0,那么 步长在变为最初的大小。

# [29] 两数相除
#

# @lc code=start
class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        n,m=dividend,divisor
        MAX=2**31-1
        MIN=0-2**31
        dividend=abs(dividend)
        divisor=abs(divisor)

        y=divisor
        i=1
        re=0
        while i>0:
            x=dividend-divisor
            if i==1 and x<0:
                print(re)
                break

            if x>0:
                dividend=x
                divisor+=divisor
                re=re+i
                i+=i
        


            elif x==0:
                re=re+i
                print(re)
                break
            else:
                i=1
                divisor=y

        if (m>0 and n>0) or (m<0 and n<0):
            return min(re,MAX)
        else:return max(0-re,MIN)



# @lc code=end