首页 > 其他分享 >2023-05-19:汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,每个 station[i] 代表一个加油站, 它位于出发位置东面 station[i][

2023-05-19:汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,每个 station[i] 代表一个加油站, 它位于出发位置东面 station[i][

时间:2023-05-19 23:01:45浏览次数:49  
标签:cnt return target stations int 加油站 station heap 出发

2023-05-19:汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。

沿途有加油站,每个 station[i] 代表一个加油站,

它位于出发位置东面 station[i][0] 英里处,并且有 station[i][1] 升汽油。

假设汽车油箱的容量是无限的,其中最初有 startFuel 升燃料。

它每行驶 1 英里就会用掉 1 升汽油。

当汽车到达加油站时,它可能停下来加油,将所有汽油从加油站转移到汽车中。

为了到达目的地,汽车所必要的最低加油次数是多少?如果无法到达目的地,则返回 -1 。

注意:如果汽车到达加油站时剩余燃料为 0,它仍然可以在那里加油。

如果汽车到达目的地时剩余燃料为 0,仍然认为它已经到达目的地。

输入:target = 100, startFuel = 10, stations = [[10,60],[20,30],[30,30],[60,40]]。

输出:2。

答案2023-05-19:

具体步骤如下:

1.初始化车内油量 to 和已经加得次数 cnt。

2.遍历所有加油站,对于每个加油站,判断能否到达。如果不能到达,就从大根堆中不断取出油量添加到车内,直至可以到达该加油站或无法再添加油量为止。如果无法到达该加油站,则无法到达目标位置,返回-1。

3.如果能够到达该加油站,则将该加油站的油量添加到大根堆中,并继续向前移动。

4.如果无法到达目标位置,则不断从大根堆中取出油量,直至能够到达目标位置或者大根堆为空为止。

5.返回已经加油的次数。

时间复杂度:O(nlogn),其中n为加油站的数量。主要是因为该算法使用了堆来维护加油站的油量,每次需要考虑哪个加油站的油量最多,以便优先选择加油量最大的加油站。

空间复杂度:O(n),其中n为加油站的数量。主要是因为该算法使用了堆存储加油站的油量,所以需要额外的空间存储堆中的元素。

go完整代码如下:

package main

import (
	"container/heap"
)

func minRefuelStops(target int, startFuel int, stations [][]int) int {
	if startFuel >= target {
		return 0
	}

	// 大根堆
	// 维持的是:最值得加油的加油站,有多少油
	// 最值得:加得次数少,跑的还最远
	h := &IntHeap{}
	heap.Init(h)

	// 当前车里的油,能达到的位置
	to := startFuel
	cnt := 0

	for _, station := range stations {
		position := station[0]
		fuel := station[1]

		if to < position {
			for !h.IsEmpty() && to < position {
				to += heap.Pop(h).(int)
				cnt++
				if to >= target {
					return cnt
				}
			}
			if to < position {
				return -1
			}
		}
		heap.Push(h, fuel)
	}

	// 最后一个加油站的位置,都达到了
	// 但还没有到target
	for !h.IsEmpty() {
		to += heap.Pop(h).(int)
		cnt++
		if to >= target {
			return cnt
		}
	}

	return -1
}

func main() {
	target := 100
	startFuel := 10
	stations := [][]int{{10, 60}, {20, 30}, {30, 30}, {60, 40}}
	result := minRefuelStops(target, startFuel, stations)
	println(result)
}

// IntHeap实现大根堆
type IntHeap []int

func (h IntHeap) Len() int {
	return len(h)
}

func (h IntHeap) Less(i, j int) bool {
	return h[i] > h[j]
}

func (h IntHeap) Swap(i, j int) {
	h[i], h[j] = h[j], h[i]
}

func (h *IntHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
}

func (h *IntHeap) Pop() interface{} {
	n := len(*h)
	x := (*h)[n-1]
	*h = (*h)[:n-1]
	return x
}

func (h *IntHeap) IsEmpty() bool {
	return h.Len() == 0
}

2023-05-19:汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,每个 station[i] 代表一个加油站, 它位于出发位置东面 station[i][_大根堆

rust完整代码如下:

use std::collections::BinaryHeap;

fn min_refuel_stops(target: i32, start_fuel: i32, stations: Vec<Vec<i32>>) -> i32 {
    if start_fuel >= target {
        return 0;
    }

    // 大根堆
    // 维持的是:最值得加油的加油站,有多少油
    // 最值得:加得次数少,跑的还最远
    let mut heap = BinaryHeap::new();

    // 当前车里的油,能达到的位置
    let mut to = start_fuel as i64;
    let mut cnt = 0;

    for station in stations.iter() {
        let position = station[0] as i64;
        let fuel = station[1] as i64;

        if to < position {
            while !heap.is_empty() && to < position {
                to += heap.pop().unwrap();
                cnt += 1;
                if to >= target as i64 {
                    return cnt;
                }
            }
            if to < position {
                return -1;
            }
        }
        heap.push(fuel);
    }

    // 最后一个加油站的位置,都达到了
    // 但还没有到target
    while !heap.is_empty() {
        to += heap.pop().unwrap();
        cnt += 1;
        if to >= target as i64 {
            return cnt;
        }
    }

    -1
}

fn main() {
    let target = 100;
    let start_fuel = 10;
    let stations = vec![vec![10, 60], vec![20, 30], vec![30, 30], vec![60, 40]];
    let result = min_refuel_stops(target, start_fuel, stations);
    println!("{}", result);
}

2023-05-19:汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,每个 station[i] 代表一个加油站, 它位于出发位置东面 station[i][_ci_02

c语言完整代码如下:

#include <stdio.h>
#include <stdlib.h>

// IntHeap实现大根堆,这里用函数指针代替仿函数
int cmp(int a, int b) {
    return a < b;
}

// 交换两个数的值
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

typedef struct IntHeap {
    int (*cmp)(int, int);

    void (*swap)(int*, int*);

    int* data;
    int size;
    int capacity;
}IntHeap;

// 初始化大根堆
void initHeap(IntHeap* heap, int (*cmp)(int, int)) {
    heap->cmp = cmp;
    heap->swap = &swap;
    heap->data = (int*)malloc(sizeof(int) * 128);
    heap->size = 0;
    heap->capacity = 128;
}

// 扩容
void resize(IntHeap* heap) {
    int newCapacity = heap->capacity * 2;
    int* newData = (int*)realloc(heap->data, sizeof(int) * newCapacity);
    heap->data = newData;
    heap->capacity = newCapacity;
}

// 堆化
void down(IntHeap* heap, int i) {
    while (i * 2 + 1 < heap->size) {
        int left = i * 2 + 1;
        int right = i * 2 + 2;
        int j = left;
        if (right < heap->size && heap->cmp(heap->data[right], heap->data[left])) {
            j = right;
        }
        if (heap->cmp(heap->data[i], heap->data[j])) {
            break;
        }
        heap->swap(&heap->data[i], &heap->data[j]);
        i = j;
    }
}

// 入堆
void pushHeap(IntHeap* heap, int val) {
    if (heap->size == heap->capacity) {
        resize(heap);
    }
    heap->data[heap->size++] = val;

    int i = heap->size - 1;
    while (i > 0) {
        int p = (i - 1) / 2;
        if (heap->cmp(heap->data[p], heap->data[i])) {
            break;
        }
        heap->swap(&heap->data[p], &heap->data[i]);
        i = p;
    }
}

// 弹出堆顶元素
int popHeap(IntHeap* heap) {
    int top = heap->data[0];
    heap->data[0] = heap->data[--heap->size];
    down(heap, 0);
    return top;
}

int minRefuelStops(int target, int startFuel, int** stations, int stationsSize, int* stationsColSize) {
    if (startFuel >= target) {
        return 0;
    }

    // 大根堆
    // 维持的是:最值得加油的加油站,有多少油
    // 最值得:加得次数少,跑的还最远
    IntHeap heap;
    initHeap(&heap, &cmp);

    // 当前车里的油,能达到的位置
    long long to = startFuel;
    int cnt = 0;

    for (int i = 0; i < stationsSize; i++) {
        int position = stations[i][0];
        int fuel = stations[i][1];

        if (to < position) {
            while (heap.size && to < position) {
                to += popHeap(&heap);
                cnt++;
                if (to >= target) {
                    return cnt;
                }
            }
            if (to < position) {
                return -1;
            }
        }
        pushHeap(&heap, fuel);
    }

    // 最后一个加油站的位置,都达到了
    // 但还没有到 target
    while (heap.size) {
        to += popHeap(&heap);
        cnt++;
        if (to >= target) {
            return cnt;
        }
    }

    return -1;
}

int main() {
    int target = 100;
    int startFuel = 10;
    int** stations = (int**)malloc(sizeof(int*) * 4);
    int stationsColSize[4] = { 2, 2, 2, 2 };
    for (int i = 0; i < 4; i++) {
        stations[i] = (int*)malloc(sizeof(int) * 2);
    }
    stations[0][0] = 10;
    stations[0][1] = 60;
    stations[1][0] = 20;
    stations[1][1] = 30;
    stations[2][0] = 30;
    stations[2][1] = 30;
    stations[3][0] = 60;
    stations[3][1] = 40;
    int result = minRefuelStops(target, startFuel, stations, 4, stationsColSize);
    printf("%d\n", result);

    for (int i = 0; i < 4; i++) {
        free(stations[i]);
    }
    free(stations);

    return 0;
}

2023-05-19:汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,每个 station[i] 代表一个加油站, 它位于出发位置东面 station[i][_大根堆_03

c++完整代码如下:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

// IntHeap实现大根堆
struct IntHeap {
    bool operator()(int a, int b) { return a < b; }
};

int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
    if (startFuel >= target) {
        return 0;
    }

    // 大根堆
    // 维持的是:最值得加油的加油站,有多少油
    // 最值得:加得次数少,跑的还最远
    priority_queue<int, vector<int>, IntHeap> heap;

    // 当前车里的油,能达到的位置
    long long to = startFuel;
    int cnt = 0;

    for (auto station : stations) {
        int position = station[0];
        int fuel = station[1];

        if (to < position) {
            while (!heap.empty() && to < position) {
                to += heap.top();
                heap.pop();
                cnt++;
                if (to >= target) {
                    return cnt;
                }
            }
            if (to < position) {
                return -1;
            }
        }
        heap.push(fuel);
    }

    // 最后一个加油站的位置,都达到了
    // 但还没有到target
    while (!heap.empty()) {
        to += heap.top();
        heap.pop();
        cnt++;
        if (to >= target) {
            return cnt;
        }
    }

    return -1;
}

int main() {
    int target = 100;
    int startFuel = 10;
    vector<vector<int>> stations = { {10, 60}, {20, 30}, {30, 30}, {60, 40} };
    int result = minRefuelStops(target, startFuel, stations);
    cout << result << endl;
    return 0;
}

2023-05-19:汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,每个 station[i] 代表一个加油站, 它位于出发位置东面 station[i][_#include_04

标签:cnt,return,target,stations,int,加油站,station,heap,出发
From: https://blog.51cto.com/moonfdd/6315811

相关文章

  • 可以玩战神,免费看VIP电影电视剧的小主机Station M3
    StationPC现面向全球招募分销商合作伙伴,寻求志同道合的你,有兴趣的小伙伴请发邮件到sales@stationpc.com ......
  • vCenter Server 8.0U1 OVF:在 Fusion 和 Workstation 中快速部署 vCSA
    vCenterServer8.0U1系列更新请访问原文链接:https://sysin.org/blog/vmware-vcenter-8-ovf/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org新的IA/GA模型vSphere8版本发布转向了新的IA/GA(初始可用性/通用可用性)模型。发布周期如下:所有主要和更新的vSpher......
  • LeetCode 134.加油站
    1.题目:在一条环路上有n 个加油站,其中第i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以绕环路行驶一周,则返回......
  • 134. 加油站
    在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以绕环路行驶一周,则返回出发时加油......
  • 解决VM ware问题,此主机不支持64位客户机操作系统,此系统无法运行;VMware Workstation 与
    问题1:此主机不支持64位客户机操作系统,此系统无法运行;问题2:VMwareWorkstation与Device/CredentialGuard不兼容尝试解决办法,关闭win10的内核隔离进入windows10安全中心-》点击设备安全性--》关闭内核隔离 ---》 ......
  • VMware Workstation 快速克隆CentOS 7
    一、操作     ......
  • 从实例出发,了解单例模式和静态块
    就算你没有用到过其他的设计模式,但是单例模式你肯定接触过,比如,Spring中bean默认就是单例模式的,所有用到这个bean的实例其实都是同一个。单例模式的使用场景什么是单例模式呢,单例模式(Singleton)又叫单态模式,它出现目的是为了保证一个类在系统中只有一个实例,并提供一个访问它的......
  • VMware Workstation 配置 Linux虚拟机网卡
    目录1.配置VMwareworkstation网卡(1)查看当前电脑上的虚拟网卡(2)虚拟机的三种网卡模式(3)配置VMware网卡模式2.配置虚拟机Linuxens33网卡(1)打开linux终端(2)进入ens33网卡配置文件(3)查看VMware虚拟网卡配置信息(4)修改ens33配置文件(5)检测是否配置成功1.配置VMwareworkstation网卡......
  • VMware Workstation 安装 Linux操作系统虚拟机详细步骤
    VMwareWorkstation安装Linux操作系统虚拟机详细步骤......
  • 解决VMware Workstation安装VMware Tools显示灰色的办法
    想在VMwareWorkstation中安装VMwareTools,方便文件的复制粘贴。但是如下图,总是灰色按照网上教程设置方法一:1.关闭虚拟机;2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤;3.再重启虚拟机,灰色字即点亮。灰色没有点亮。 接着尝试了方法二:1.关闭虚......