1. solution exception:索引超出了数组界限。_1_两数之和(java)

两数之和

问题描述:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

代码:

package algorithm;

import java.util.Arrays;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

public class Solution {

// 解法1:暴力法

public int[] twoSum(int[] nums, int target) {

int i, j;

int sum;

// 外层循环遍历每一个元素

for (i = 0; i <= nums.length; i++) {

// 内层循环遍历除i以外的值

// 并判断是否存在一个值与nums[i]之和等于target

for (j = i + 1; j <= nums.length; j++) {

sum = nums[i] + nums[j];

if (sum == target) {

return new int[] { i, j };

}

}

}

throw new IllegalArgumentException("No two sum solution");

}

// 解法2 两遍哈希表

public int[] twoSum_1(int[] nums, int target) {

Map map = new HashMap<>();

// 第一个循环,将数据元素的值和索引存到哈希表中

for (int i = 0; i < nums.length; i++) {

map.put(nums[i], i);

}

// 第二个循环,遍历各元素与目标值target的差值,是否存在于哈希表中

// 存在则输出该值与差值的索引值

for (int i = 0; i < nums.length; i++) {

int complement = target - nums[i];

if (map.containsKey(complement) && map.get(complement) != i) {

return new int[] { i, map.get(complement) };

}

}

throw new IllegalArgumentException("No two sum solution");

}

// 解法3 一遍哈希表

// 在迭代并将元素插入到哈希表中的同时,先校验哈希表中是否存在当前元素所对应的目标元素,如果有则直接返回

public int[] twoSum_2(int[] nums, int target) {

Map map = new HashMap<>();

for (int i = 0; i < nums.length; i++) {

int complement = target - nums[i];

if (map.containsKey(complement)) {

return new int[] {i,map.get(complement)};

}

map.put(nums[i], i);

}

throw new IllegalArgumentException("No two sum solution");

}

// main

public static void main(String[] args) {

Solution solution = new Solution();

Scanner input = new Scanner(System.in);

System.out.println("请输入数组长度:");

int n = input.nextInt();

int[] nums = new int[n];

for (int i = 0; i < n; i++) {

System.out.println("输入第" + i + "个数:");

nums[i] = input.nextInt();

}

System.out.println("请输入目标值:");

int m = input.nextInt();

int target = m;

System.out.println("目标值:" + target);

System.out.println("整数数组 nums=" + Arrays.toString(nums));

// 计算一个方法执行时长,可用模板来写

long startTime = System.currentTimeMillis();

//int[] twoSum = solution.twoSum(nums, target);

//int[] twoSum_1 = solution.twoSum_1(nums, target);

int[] twoSum_2 = solution.twoSum_2(nums, target);

long endTime = System.currentTimeMillis();

float excTime = (float) (endTime - startTime) / 1000;

System.out.println("结果=" + Arrays.toString(twoSum_2) + ",执行时间=" + excTime + 's');

}

}

dc08551c053fbd1e04546500bc5e19dc.png
class AbstractGreedyAndPrune(): def __init__(self, aoi: AoI, uavs_tours: dict, max_rounds: int, debug: bool = True): self.aoi = aoi self.max_rounds = max_rounds self.debug = debug self.graph = aoi.graph self.nnodes = self.aoi.n_targets self.uavs = list(uavs_tours.keys()) self.nuavs = len(self.uavs) self.uavs_tours = {i: uavs_tours[self.uavs[i]] for i in range(self.nuavs)} self.__check_depots() self.reachable_points = self.__reachable_points() def __pruning(self, mr_solution: MultiRoundSolution) -> MultiRoundSolution: return utility.pruning_multiroundsolution(mr_solution) def solution(self) -> MultiRoundSolution: mrs_builder = MultiRoundSolutionBuilder(self.aoi) for uav in self.uavs: mrs_builder.add_drone(uav) residual_ntours_to_assign = {i : self.max_rounds for i in range(self.nuavs)} tour_to_assign = self.max_rounds * self.nuavs visited_points = set() while not self.greedy_stop_condition(visited_points, tour_to_assign): itd_uav, ind_tour = self.local_optimal_choice(visited_points, residual_ntours_to_assign) residual_ntours_to_assign[itd_uav] -= 1 tour_to_assign -= 1 opt_tour = self.uavs_tours[itd_uav][ind_tour] visited_points |= set(opt_tour.targets_indexes) # update visited points mrs_builder.append_tour(self.uavs[itd_uav], opt_tour) return self.__pruning(mrs_builder.build()) class CumulativeGreedyCoverage(AbstractGreedyAndPrune): choice_dict = {} for ind_uav in range(self.nuavs): uav_residual_rounds = residual_ntours_to_assign[ind_uav] if uav_residual_rounds > 0: uav_tours = self.uavs_tours[ind_uav] for ind_tour in range(len(uav_tours)): tour = uav_tours[ind_tour] quality_tour = self.evaluate_tour(tour, uav_residual_rounds, visited_points) choice_dict[quality_tour] = (ind_uav, ind_tour) best_value = max(choice_dict, key=int) return choice_dict[best_value] def evaluate_tour(self, tour : Tour, round_count : int, visited_points : set): new_points = (set(tour.targets_indexes) - visited_points) return round_count * len(new_points) 如何改写上述程序,使其能返回所有已经探索过的目标点visited_points的数量,请用代码表示
最新发布
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值