1.给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
![]()
static int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
for (int i = 0; i<nums.length; i++) {
for (int j = i+1; j<nums.length; j++) {
if (nums[i]+nums[j] == target) {
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
/**
* @author: XiSoil
*执行分布用时55ms,击败的14.72%Java用户
*消耗内存分布43.64MB,击败的88.06%Java用户
**/
Solution
![]()
public int[] twoSum(int[] nums, int target) {
// 创建一个 Map 用于存储数值与其对应的下标
Map<Integer, Integer> valueToIndex = new HashMap<>();
// 使用双指针法,在数组两端同时进行遍历
for (int i = 0, j = nums.length - 1; i <= j; i++, j--) {
// 如果 i 和 j 不相同,且两数之和等于目标值
if (i != j && nums[i] + nums[j] == target) {
// 返回 i 和 j 的值作为结果
return new int[]{i, j};
}
// 计算目标值与当前值的差值
int x = target - nums[i];
// 如果 Map 中包含差值,则返回当前下标和 Map 中存储的下标
if (valueToIndex.containsKey(x)) {
return new int[]{i, valueToIndex.get(x)};
}
// 如果 i 和 j 相等,即只剩一个数时
if (i == j) {
return null;
// 返回空,表示无法找到满足条件的数对
}
// 计算目标值与当前值的差值
x = target - nums[j];
// 如果 Map 中包含差值,则返回当前下标和 Map 中存储的下标
if (valueToIndex.containsKey(x)) {
return new int[]{j, valueToIndex.get(x)};
}
// 将当前值及其下标存入 Map 中
valueToIndex.put(nums[i], i);
valueToIndex.put(nums[j], j);
}
return null;
// 所有情况都不符合要求,返回空
}
最速优解
2.给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
![]()
public static class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
while (l1 != null || l2 != null) {
curr.next = new ListNode(0);
if (l1 != null) {
if ((curr.val += l1.val) >= 10) {
curr.val -= 10;
curr.next.val = curr.next.val + 1;
}
l1 = l1.next;
}
if (l2 != null) {
if ((curr.val += l2.val) >= 10) {
curr.val -= 10;
curr.next.val = curr.next.val + 1;
}
l2 = l2.next;
}
curr = curr.next;
}
if (curr.val == 0) {
ListNode node = dummy;
while (node.next.next != null) {
node = node.next;
}
node.next = null;
}
return dummy;
}
/**
* @author XiSoil
* @date 2024/04/12
*执行分布用时1ms,击败的100.00%Java用户
*消耗内存分布43.57MB,击败的11.97%Java用户
**/
Solution
3.给定一个字符串 s ,请你找出其中不含有重复字符的 最长
子串
的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
![]()
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int maxLen = 0;
int max = 0;
char[] chars = s.toCharArray();
int start = 0;
int end = chars.length - 1;
ArrayList<Character> list = new ArrayList<>();
while (start <= end) {
for (int i = start; i <= end; i++) {
if (!list.contains(chars[i])) {
list.add(chars[i]);
maxLen++;
max = Math.max(max, maxLen);
} else {
maxLen = 0;
list.clear();
break;
}
}
start++;
}
return max;
}
/**
* @author XiSoil
* @date 2024/04/12 20:35
*执行分布用时609ms,击败的5.02%Java用户
*消耗内存分布42.06MB,击败的95.41%Java用户
**/
Solution
2923.一场比赛中共有 n 支队伍,按从 0 到 n - 1 编号。
给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足 0 <= i, j <= n - 1 且 i != j 的所有 i, j :如果 grid[i][j] == 1,那么 i 队比 j 队 强 ;否则,j 队比 i 队 强 。
在这场比赛中,如果不存在某支强于 a 队的队伍,则认为 a 队将会是 冠军 。
返回这场比赛中将会成为冠军的队伍。
示例 1:
输入:grid = [[0,1],[0,0]]
输出:0
解释:比赛中有两支队伍。
grid[0][1] == 1 表示 0 队比 1 队强。所以 0 队是冠军。
示例 2:
输入:grid = [[0,0,1],[1,0,1],[0,0,0]]
输出:1
解释:比赛中有三支队伍。
grid[1][0] == 1 表示 1 队比 0 队强。
grid[1][2] == 1 表示 1 队比 2 队强。
所以 1 队是冠军。
tips:
n == grid.length
n == grid[i].length
2 <= n <= 100
grid[i][j] 的值为 0 或 1
对于所有 i, grid[i][i] 等于 0.
对于满足 i != j 的所有 i, j ,grid[i][j] != grid[j][i] 均成立
生成的输入满足:如果 a 队比 b 队强,b 队比 c 队强,那么 a 队比 c 队强
![]()
public int findChampion(int[][] grid) {
int n = grid.length;
int m = grid[0].length;
int left = 0;
int right = m - 1;
int champion = -1;
while (left != right) {
if (grid[left][right] == 1) {
champion = left;
right--;
}else {
champion = right;
left++;
}
}
return champion;
}
/**
* @author XiSoil
* @date 2024/04/12 21:05
*执行分布用时0ms,击败的100%Java用户
*消耗内存分布44.46MB,击败的12.41%Java用户
**/
Solution