第45周 ARTS 2019 08 25

本文探讨了LeetCode上的颜色分类问题,采用三指针思想进行优化,同时介绍了快排的非递归实现方法,深入解析了对象锁定与同步机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Algorithm:75. 颜色分类
Review: Synchronization and Object Locking
Tip/Tech:快排的非递归实现
Share:爱尔兰青少年因从海洋中去除微塑料而获得谷歌科学奖

Algorithm

75. 颜色分类

https://leetcode-cn.com/problems/sort-colors/
在这里插入图片描述
三指针的思想:
设置一个左指针,这个指针只用来标记0的位置,设置右指针,这个指针只用来标记2的位置,那个用来遍历整个数组的指针,只要遍历到0,就和左指针所在的元素进行交换,交换完,左指针向左移动一位;只要遍历到2,就和右指针的所在的元素进行交换,交换完,右指针向右边移动一位。

class Solution {
    public void sortColors(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int index = 0;
        while (index <= right) {
            if (nums[index] == 0) {
                swap(nums, index, left);
                index++;
                left++;
            } else if (nums[index] == 2) {
                swap(nums, index, right);
                right--;
            } else {
                index++;
            }
        }
    }

    public void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

Review

Synchronization and Object Locking

https://wiki.openjdk.java.net/display/HotSpot/Synchronization
在这里插入图片描述
对象头中有个标记字段,它的最后两位是用来表示对象的锁的状态:

1)00:代表轻量级锁
2)01:代表无锁
3)10:代表重量级锁
4)11:和垃圾回收算法有关

上面的的图展示了是如何对象锁定的,对象头中的最后两位是用来标识对象被上了什么锁的,所以我们一般是用来表示这个对象是否被上锁了,线程也是根据这个来判断对象是否上锁了。
当进行加锁操作时,Java 虚拟机会判断是否已经是重量级锁。如果不是,它会在当前线程的当前栈桢中划出一块空间,作为该锁的锁记录,并且将锁对象的标记字段复制到该锁记录中。

Tip/Tech

快排的非递归实现

因为这个礼拜做了几道题目,所以需要重新用到快排的partition函数,所以重新理解了一下快排,结合一些资料,重新写了快排,单边循环实现partition函数。

private String START_INDEX = "startIndex";
private String END_INDEX = "endIndex";
public void quickSortNoRe(int[] arr, int start, int end) {
    Stack<Map<String, Integer>> stack = new Stack<>();
    Map<String, Integer> rootParam = new HashMap<>();
    rootParam.put(START_INDEX, start);
    rootParam.put(END_INDEX, end);
    stack.push(rootParam);
    while (!stack.isEmpty()) {
        Map<String, Integer> tempMap = stack.pop();
        int tempStart = tempMap.get(START_INDEX);
        int tempEnd = tempMap.get(END_INDEX);
        int pivotIndex = partition3(arr, tempStart, tempEnd);
        if (tempStart < pivotIndex - 1) {
            Map<String, Integer> leftParam = new HashMap<>();
            leftParam.put(START_INDEX, start);
            leftParam.put(END_INDEX, pivotIndex - 1);
            stack.push(leftParam);
        }
        if (tempEnd > pivotIndex + 1) {
            Map<String, Integer> rightParam = new HashMap<>();
            rightParam.put(START_INDEX, pivotIndex + 1);
            rightParam.put(END_INDEX, end);
            stack.push(rightParam);
        }
    }
}
/**
 * 单边循环解决
  * @param arr
  * @param startIndex
  * @param endIndex
  * @return
  */
private int partition3(int[] arr, int startIndex, int endIndex) {
    int pivotIndex = startIndex;
    int pivotValue = arr[startIndex];
    for (int i = startIndex + 1; i <= endIndex; ++i) {
        if (pivotValue > arr[i]) {
            pivotIndex++;
            if (pivotIndex != i) {
                swap(arr, pivotIndex, i);
            }
        }
    }
    swap(arr, startIndex, pivotIndex);
    return pivotIndex;
}

Share

Irish Teenager Wins Google Science Award for Removing Microplastics From Oceans

爱尔兰青少年因从海洋中去除微塑料而获得谷歌科学奖

https://www.ecowatch.com/google-science-award-irish-teenager-2639623184.html
首先我们要知道什么是微塑料,这玩意看着名字人畜无害,其实相当的恐怖。

微塑料,是一种直径小于5毫米的塑料颗粒,是一种造成污染的主要载体。微塑料体积小,这就意味着更高的比表面积(比表面积指多孔固体物质单位质量所具有的表面积 ),比表面积越大,吸附的污染物的能力越强。
首先,环境中已经存在大量的多氯联苯、双酚A等持久性有机污染物(这些有机污染物往往是疏水的,就是说它们不太容易溶解在水中,所以它们往往不能随着水流随意流动),一旦微塑料和这些污染物相遇,正好聚集形成一个有机污染球体。微塑料相当于成为污染物的坐骑,二者可以在环境中到处游荡。

因为我们现在对塑料制品大规模的使用,微塑料正在变的越来越多,而且势头有点不可阻挡了,前段时间,已经有科学家在我们的日常饮用水中发现了微塑料,而且,有的体积更小的,会直接进入人体,少量没啥问题,但是量一旦到了一定程度,那么就会危害身体。
这个少年能够解决这个问题,对整个环境是大有益处的,确实,会对人造成影响的,同样也会对动物植物造成不小的影响。
我觉得以后可降解的纸包装会不断的增加,让人们使用塑料的频率大大的减少,我们平时用的塑料袋啊这些,都是很大的塑料的污染来源,现在去药店买药,店员有的都不用塑料包装了都,先都是提供了纸袋,也算是一种趋势吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值