mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
update 0332.重新安排行程 :删除相同思路的冗余 go 代码,调整 c 代码位置
This commit is contained in:
@ -86,7 +86,7 @@ unordered_map<string, map<string, int>> targets:unordered_map<出发机场, ma
|
|||||||
在遍历 `unordered_map<出发机场, map<到达机场, 航班次数>> targets`的过程中,**可以使用"航班次数"这个字段的数字做相应的增减,来标记到达机场是否使用过了。**
|
在遍历 `unordered_map<出发机场, map<到达机场, 航班次数>> targets`的过程中,**可以使用"航班次数"这个字段的数字做相应的增减,来标记到达机场是否使用过了。**
|
||||||
|
|
||||||
|
|
||||||
如果“航班次数”大于零,说明目的地还可以飞,如果如果“航班次数”等于零说明目的地不能飞了,而不用对集合做删除元素或者增加元素的操作。
|
如果“航班次数”大于零,说明目的地还可以飞,如果“航班次数”等于零说明目的地不能飞了,而不用对集合做删除元素或者增加元素的操作。
|
||||||
|
|
||||||
**相当于说我不删,我就做一个标记!**
|
**相当于说我不删,我就做一个标记!**
|
||||||
|
|
||||||
@ -439,68 +439,6 @@ func findItinerary(tickets [][]string) []string {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### C语言
|
|
||||||
|
|
||||||
```C
|
|
||||||
char **result;
|
|
||||||
bool *used;
|
|
||||||
int g_found;
|
|
||||||
|
|
||||||
int cmp(const void *str1, const void *str2)
|
|
||||||
{
|
|
||||||
const char **tmp1 = *(char**)str1;
|
|
||||||
const char **tmp2 = *(char**)str2;
|
|
||||||
int ret = strcmp(tmp1[0], tmp2[0]);
|
|
||||||
if (ret == 0) {
|
|
||||||
return strcmp(tmp1[1], tmp2[1]);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void backtracting(char *** tickets, int ticketsSize, int* returnSize, char *start, char **result, bool *used)
|
|
||||||
{
|
|
||||||
if (*returnSize == ticketsSize + 1) {
|
|
||||||
g_found = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < ticketsSize; i++) {
|
|
||||||
if ((used[i] == false) && (strcmp(start, tickets[i][0]) == 0)) {
|
|
||||||
result[*returnSize] = (char*)malloc(sizeof(char) * 4);
|
|
||||||
memcpy(result[*returnSize], tickets[i][1], sizeof(char) * 4);
|
|
||||||
(*returnSize)++;
|
|
||||||
used[i] = true;
|
|
||||||
/*if ((*returnSize) == ticketsSize + 1) {
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
backtracting(tickets, ticketsSize, returnSize, tickets[i][1], result, used);
|
|
||||||
if (g_found) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
(*returnSize)--;
|
|
||||||
used[i] = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char ** findItinerary(char *** tickets, int ticketsSize, int* ticketsColSize, int* returnSize){
|
|
||||||
if (tickets == NULL || ticketsSize <= 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
result = malloc(sizeof(char*) * (ticketsSize + 1));
|
|
||||||
used = malloc(sizeof(bool) * ticketsSize);
|
|
||||||
memset(used, false, sizeof(bool) * ticketsSize);
|
|
||||||
result[0] = malloc(sizeof(char) * 4);
|
|
||||||
memcpy(result[0], "JFK", sizeof(char) * 4);
|
|
||||||
g_found = 0;
|
|
||||||
*returnSize = 1;
|
|
||||||
qsort(tickets, ticketsSize, sizeof(tickets[0]), cmp);
|
|
||||||
backtracting(tickets, ticketsSize, returnSize, "JFK", result, used);
|
|
||||||
*returnSize = ticketsSize + 1;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Javascript
|
### Javascript
|
||||||
```Javascript
|
```Javascript
|
||||||
|
|
||||||
@ -589,6 +527,68 @@ function findItinerary(tickets: string[][]): string[] {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### C语言
|
||||||
|
|
||||||
|
```C
|
||||||
|
char **result;
|
||||||
|
bool *used;
|
||||||
|
int g_found;
|
||||||
|
|
||||||
|
int cmp(const void *str1, const void *str2)
|
||||||
|
{
|
||||||
|
const char **tmp1 = *(char**)str1;
|
||||||
|
const char **tmp2 = *(char**)str2;
|
||||||
|
int ret = strcmp(tmp1[0], tmp2[0]);
|
||||||
|
if (ret == 0) {
|
||||||
|
return strcmp(tmp1[1], tmp2[1]);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void backtracting(char *** tickets, int ticketsSize, int* returnSize, char *start, char **result, bool *used)
|
||||||
|
{
|
||||||
|
if (*returnSize == ticketsSize + 1) {
|
||||||
|
g_found = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < ticketsSize; i++) {
|
||||||
|
if ((used[i] == false) && (strcmp(start, tickets[i][0]) == 0)) {
|
||||||
|
result[*returnSize] = (char*)malloc(sizeof(char) * 4);
|
||||||
|
memcpy(result[*returnSize], tickets[i][1], sizeof(char) * 4);
|
||||||
|
(*returnSize)++;
|
||||||
|
used[i] = true;
|
||||||
|
/*if ((*returnSize) == ticketsSize + 1) {
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
|
backtracting(tickets, ticketsSize, returnSize, tickets[i][1], result, used);
|
||||||
|
if (g_found) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(*returnSize)--;
|
||||||
|
used[i] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char ** findItinerary(char *** tickets, int ticketsSize, int* ticketsColSize, int* returnSize){
|
||||||
|
if (tickets == NULL || ticketsSize <= 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
result = malloc(sizeof(char*) * (ticketsSize + 1));
|
||||||
|
used = malloc(sizeof(bool) * ticketsSize);
|
||||||
|
memset(used, false, sizeof(bool) * ticketsSize);
|
||||||
|
result[0] = malloc(sizeof(char) * 4);
|
||||||
|
memcpy(result[0], "JFK", sizeof(char) * 4);
|
||||||
|
g_found = 0;
|
||||||
|
*returnSize = 1;
|
||||||
|
qsort(tickets, ticketsSize, sizeof(tickets[0]), cmp);
|
||||||
|
backtracting(tickets, ticketsSize, returnSize, "JFK", result, used);
|
||||||
|
*returnSize = ticketsSize + 1;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Swift
|
### Swift
|
||||||
|
|
||||||
直接迭代tickets数组:
|
直接迭代tickets数组:
|
||||||
@ -709,78 +709,6 @@ for line in tickets {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Go
|
|
||||||
```Go
|
|
||||||
|
|
||||||
// 先排序,然后找到第一条路径即可返回
|
|
||||||
func findItinerary(tickets [][]string) []string {
|
|
||||||
var path []string // 用来保存搜索的路径
|
|
||||||
data := make(map[string]ticketSlice) // 用来保存tickets排序后的结果
|
|
||||||
|
|
||||||
var search func(airport string) bool
|
|
||||||
search = func(airport string) bool {
|
|
||||||
if len(path) == len(tickets) {
|
|
||||||
path = append(path, airport)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
to := data[airport]
|
|
||||||
for _, item := range to {
|
|
||||||
if item.Count == 0 {
|
|
||||||
// 已用完
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
path = append(path, airport)
|
|
||||||
item.Count--
|
|
||||||
if search(item.To) { return true }
|
|
||||||
item.Count++
|
|
||||||
path = path[:len(path) - 1]
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// 排序
|
|
||||||
// 感觉这段代码有点啰嗦,不知道能不能简化一下
|
|
||||||
tmp := make(map[string]map[string]int)
|
|
||||||
for _, ticket := range tickets {
|
|
||||||
if to, ok := tmp[ticket[0]]; ok {
|
|
||||||
if _, ok2 := to[ticket[1]]; ok2 {
|
|
||||||
to[ticket[1]]++
|
|
||||||
} else {
|
|
||||||
to[ticket[1]] = 1
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tmp[ticket[0]] = map[string]int{
|
|
||||||
ticket[1]: 1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for from, to := range tmp {
|
|
||||||
var tmp ticketSlice
|
|
||||||
for to, num := range to {
|
|
||||||
tmp = append(tmp, &ticketStat{To: to, Count: num})
|
|
||||||
}
|
|
||||||
sort.Sort(tmp)
|
|
||||||
data[from] = tmp
|
|
||||||
}
|
|
||||||
|
|
||||||
search("JFK")
|
|
||||||
return path
|
|
||||||
}
|
|
||||||
|
|
||||||
type ticketStat struct {
|
|
||||||
To string
|
|
||||||
Count int
|
|
||||||
}
|
|
||||||
type ticketSlice []*ticketStat
|
|
||||||
|
|
||||||
func (p ticketSlice) Len() int { return len(p) }
|
|
||||||
func (p ticketSlice) Less(i, j int) bool { return strings.Compare(p[i].To, p[j].To) == -1 }
|
|
||||||
func (p ticketSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
### Rust
|
### Rust
|
||||||
** 文中的Hashmap嵌套Hashmap的方法因为Rust的所有权问题暂时无法实现,此方法为删除哈希表中元素法 **
|
** 文中的Hashmap嵌套Hashmap的方法因为Rust的所有权问题暂时无法实现,此方法为删除哈希表中元素法 **
|
||||||
```Rust
|
```Rust
|
||||||
|
Reference in New Issue
Block a user