算法练习(6)

题目一:玩筹码(难度:简单)

有 n 个筹码。第 i 个筹码的位置是 position[i] 。

我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个筹码的位置从 position[i] 改变为:

position[i] + 2 或 position[i] - 2 ,此时 cost = 0
position[i] + 1 或 position[i] - 1 ,此时 cost = 1
返回将所有筹码移动到同一位置上所需要的 最小代价 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-cost-to-move-chips-to-the-same-position

思路:统计奇数和偶数的个数取最小值即可

class Solution(object):
    def minCostToMoveChips(self, position):
        a = 0
        b = 0
        for i in position:
            if i & 1 == 1:
                a += 1
            else:
                b += 1
        return min(a, b)

题目二:移除元素(难度:简单)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-element

思路:通过while循环遍历数组,相同则使用del删除列表中元素,同时保持下标不变。

class Solution(object):
    def removeElement(self, nums, val):
        index=0
        while index<len(nums):
            if val==nums[index]:
                del nums[index]
                continue
            index+=1
        return len(nums)

题目三:在排序数组中查找元素的第一个和最后一个位置(难度:中等)

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array

思路:通过二分查找的思路即可解决

def search(nums,target):
    left = 0
    right = len(nums)-1
    while left<=right:
        mid = (left+right)/2
        if nums[mid] >= target:
            right = mid-1
        if nums[mid] < target:
            left = mid+1
    return left

class Solution(object):
    def searchRange(self, nums, target):
        left =  search(nums,target)
        right = search(nums,target+1)
        if  left == len(nums) or nums[left] != target:
            return [-1,-1]
        else:
            return [left,right-1]

题目四:旋转图像(难度:中等)

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-image

思路:先上下交换再对角交换

class Solution(object):
    def rotate(self, matrix):
        for i in range(len(matrix)/2):
            matrix[i],matrix[len(matrix)-1-i]=matrix[len(matrix)-1-i],matrix[i]
        for i in range(len(matrix)):
            for j in range(i,len(matrix)):
                matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]

题目五:加一(难度:简单)

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/plus-one

思路:从后遍历数组,逢十进一,如果有进位则将第一位改为1,数组末尾添加一个0即可。

class Solution(object):
    def plusOne(self, digits):
        n=len(digits)-1
        digits[n]+=1
        index=0
        while n>=0:
            if digits[n]==10:
                index+=1
                digits[n]=0
                if n-1>=0:
                    n-=1
                    digits[n]+=1
            else:
                break
        if index==len(digits):
            digits[0]=1
            digits.append(0)
        return digits

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值