JZX轻语:简

LeetCode 1053 - 交换一次的先前排列

发表于2024年06月11日

#二分搜索 #贪心

为了保证交换后的数字在小于原数字的要求下尽可能大,交换的位置应尽可能靠右。因此,我们从右往左扫描,找到第一个不满足升序的位置(即对于位置iarr[i] > arr[i - 1]),然后在其右边找到最大的比它小的数(如果有重复值, 则交换最靠左的)arr[j],交换这两个数即可。

贪心可行性的证明:

class Solution:
    def countBattleships(self, board: List[List[str]]) -> int:
        ans = 0

        for i in range(len(board)):
            for j in range(len(board[i])):
                if board[i][j] == 'X' and (i == 0 or board[i - 1][j] == '.') and (j == 0 or board[i][j - 1] == '.'):
                    ans += 1
        return ans

闪念标签:LC

题目链接:https://leetcode.cn/problems/previous-permutation-with-one-swap/