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

 

posted on 2024-04-12 21:20  XiSoil  阅读(4)  评论(0编辑  收藏  举报