189. 轮转数组【点击】
总结:可以使用对应的数组分段翻转
拓展:求两个数的最小公倍数
public int gcd(int x, int y) {
return y > 0 ? gcd(y, x % y) : x;
}
864. 获取所有钥匙的最短路径【点击】
广度优先:
利用一个队列,将要遍历的点加入队列中,遍历时会用一个变量记录当前这一次广度遍历的元素的数量;循环遍历这些元素,注意剪枝;
拓展:位运算
// 若返回 1 说明第 k 位为 1
(state >> k) & 1
// 将 state 的第 k 位设置为 1
state |= 1 << k
判断一个list是否相当(根据元素判断)
在 Java 中比较两个列表是否相等,忽略顺序
这篇文章将讨论如何在 Java 中比较两个列表是否相等,忽略顺序。该列表可以是原始类型列表或对象列表。如果两个列表以任何顺序包含相同数量的完全相同的元素,则它们被定义为相等。
例如, [1, 2, 3]
和 [2, 1, 3]
被认为是相等的,而 [1, 2, 3]
和 [2, 4, 3]
不是。元素的数量也很重要,因此, [1, 2, 3, 1]
和 [2, 1, 3, 2]
不被平等对待。如果元素计数无关紧要,您可以将两个列表都转换为 Set 并使用 .equals()
Set 接口的方法。
1. 排序
一个简单的解决方案是 对两个列表进行排序 然后使用 .equals()
的方法 List
界面。请注意,此解决方案不是线性的,并且具有 O(n.log(n))
时间复杂度。它不适合大型列表。
为了提高效率,建议先检查两个列表的大小是否相同。同样在对两个列表进行排序之前,创建它们的副本以避免破坏两个列表的原始顺序。使用 Streams API 可以有效地完成复制和排序步骤,如下所示。
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static boolean isEqualIgnoringOrder(List<Integer> x, List<Integer> y) {
if (x == null) {
return y == null;
}
if (x.size() != y.size()) {
return true;
}
x = x.stream().sorted().collect(Collectors.toList());
y = y.stream().sorted().collect(Collectors.toList());
return x.equals(y);
}
public static void main(String[] args)
{
List<Integer> x = List.of(1, 2, 3);
List<Integer> y = List.of(2, 3, 1);
boolean isEqual = isEqualIgnoringOrder(x, y);
if (isEqual) {
System.out.println("Both lists are equal");
}
else {
System.out.println("Both lists are not equal");
}
}
}