[leetcode/lintcode 题解] 字节跳动面试题:01交换

简介: [leetcode/lintcode 题解] 字节跳动面试题:01交换

描述
给定一个只包含0,1两个元素的数组,只能交换相邻的元素使这个数组升序(即所有的0都在1的左边),返回最少交换次数。

  • 1 <= n <= 10^4

在线评测地址:领扣题库官网

样例1
示例1:

输入: 
nums = [1,0,1,1,0,0,0,1]
输出: [0,0,0,0,1,1,1,1]
示例 2:

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

同向双指针版
从右边开始往左。 i = right, j = left。 i需要停在0上面, j需要找到1, 然后记录交换的次数。 需要注意的是, 当交换完了以后, 原先的1就变成0了, 那么i就不能再跳过了, 那个时候, 需要处理下

class Solution:
    """
    @param nums: an Integer array
    @return: return the minimum number of swaps.
    """
    def SwapZeroOne(self, nums):
        j = len(nums) - 2
        num_swaps = 0
        exchanged = set()
        for i in range(len(nums) - 1, -1, -1):
            if i not in exchanged and nums[i] == 1:
                continue
            j = min(j, i - 1)
            while j >= 0 and nums[j] == 0:
                j -= 1
            if j >= 0 and nums[j] == 1:
                print(i, j)
                num_swaps += i - j
                exchanged.add(j)
            j -= 1
        return num_swaps

更多题解参考:九章官网solution

相关文章
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
28 0
LeetCode第二十四题(两两交换链表中的节点)
|
4月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
5月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
5月前
|
存储 算法 索引
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
|
5月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
6月前
|
SQL 算法 大数据
深入解析力扣176题:第二高的薪水(子查询与LIMIT详解及模拟面试问答)
深入解析力扣176题:第二高的薪水(子查询与LIMIT详解及模拟面试问答)
|
6月前
|
SQL 算法 大数据
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)
|
6月前
|
存储 算法 搜索推荐
深入解析力扣179题:最大数(自定义排序法详解及模拟面试问答)
深入解析力扣179题:最大数(自定义排序法详解及模拟面试问答)
|
6月前
|
SQL 大数据 数据挖掘
深入解析力扣178题:分数排名(DENSE_RANK详解及模拟面试问答)
深入解析力扣178题:分数排名(DENSE_RANK详解及模拟面试问答)
|
6月前
|
存储 算法 数据挖掘
力扣174题动态规划:地下城游戏(含模拟面试)
力扣174题动态规划:地下城游戏(含模拟面试)