如题
最直接的做法直接把每个站位的人数算出来再遍历比较即可
public static boolean carPooling(int[][] trips, int capacity) {
Map<Integer, Integer> peos = new HashMap<Integer, Integer>();// 每个候车点的人数
for (int i = 0; i < trips.length; i++) {
int[] nums = trips[i];
for (int j = nums[1]; j < nums[2]; j++) {// 上车点到下车点前一位每一位都更新
if (peos.containsKey(j)) {
peos.put(j, peos.get(j) + nums[0]);// 更新人数
} else {
peos.put(j, nums[0]);
}
}
}
for (int i : peos.keySet()) {
if (peos.get(i) > capacity) {// 大于最大人数即不可装下
return false;
}
}
return true;
}
不是很理想,再次审题发现有明确的1000个站点,换为用数组缓存
public static boolean carPooling1(int[][] trips, int capacity) {
int[] nums = new int[1001];//对应站位车上人数
for (int i = 0; i < trips.length; i++) {
int[] is = trips[i];
for (int j = is[1]; j < is[2]; j++) {
nums[j] = nums[j] + is[0];
}
}
for (int i : nums) {
if (i > capacity) {
return false;
}
}
return true;
}
有一定提升再次优化,发现最后的判断超限的循环和初始获取数据的循环都是必要的,但是中间的循环更新人数浪费大量时间,在此进行优化
public static boolean carPooling2(int[][] trips, int capacity) {
int[] nums = new int[1001];//人数变动
for (int i = 0; i < trips.length; i++) {
int[] is = trips[i];
nums[is[1]] = nums[is[1]] + is[0]; //上车点
nums[is[2]] = nums[is[2]] - is[0];//下车点
}
int count = 0;//车上人数
for (int i : nums) {
count += i;
if (count > capacity) {
return false;
}
}
return true;
}
不在缓存每个点位的车上人数,转而缓存人数的变化量,省去了大量的重复赋值操作