0217leetcode刷题5道python

120

题目描述:
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

示例:
在这里插入图片描述
解答:

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        for i in range(len(triangle) - 1, 0, -1):
            for j in range(i):
                triangle[i - 1][j] += min(triangle[i][j], triangle[i][j + 1])
        return triangle[0][0]

147

题目描述;
对链表进行插入排序。
从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。

示例:
在这里插入图片描述
解答:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        if(head==None or head.next==None):
            return head
        else:
            h=ListNode()
            h.next=head
            ##  增设一个头指针,使得操作一致。
            p=head.next
            head.next=None
            ##  第一个节点不用排序,和后面的节点断开;p指向未排序链表的第一个节点
            s=h
            st=h.next
            ##  利用插入法进行链表排序。增设两个指针,s和st。
            ##  st指向要与p进行比较的节点,s指向st的前一个节点
            while(p!=None):
                if(p.val<s.val):
                    s=h
                    st=h.next       ##  利用上次排序的结果;以减少比较次数
                
                while(st!=None and p.val>st.val):
                    s=st
                    st=st.next
                ##  已经找到位置,进行插入
                s.next=p
                p=p.next
                s.next.next=st
                s=s.next
                
            return h.next

219

题目描述:
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。

示例:
在这里插入图片描述
解答:

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        '''
        超时了
        for i in range(len(nums)-1):
            for j in range(i+1,len(nums)):
                if nums[i]==nums[j]:
                    if j-i<=k:
                        return True
        return False
        '''
        #首先是判断是存在num[i]==num[j],存在的情况下才判断|i-j|<=k
        nums_len=len(nums)
        if nums_len<=1:
            return False
        nums_dict={
    
    }
        for i in range(nums_len):
            if nums[i] in nums_dict:
                if i-nums_dict[nums[i]]<=k:
                    return True
            nums_dict[nums[i]]=i
        return False

977

题目描述:
给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

示例:
在这里插入图片描述
解答:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        for i in range(len(nums)):
            nums[i]=nums[i]*nums[i]
        return sorted(nums)

1550

题目描述:
给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回true;否则,返回false。

示例:
在这里插入图片描述
解答:

class Solution:
    def threeConsecutiveOdds(self, arr: List[int]) -> bool:
        cnt=0
        for i in arr:
            if i%2==1:
                cnt+=1
                if cnt==3:
                    return True
            else:
                cnt=0
        return False

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/113822119