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用户 **/
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用户 **/
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用户 **/
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用户 **/