力扣第299场周赛补题

一.判断矩阵是否是一个X矩阵

1.原题链接:力扣

2.解题思路:对角线的下标满足:i == j || i + j == n - 1

3.参考代码:

class Solution {
public:
    bool checkXMatrix(vector<vector<int>>& grid) {
        int n = grid.size();
        int k =0 ;
        for(int i = 0; i < n; i ++)
        {
            for(int j = 0 ; j < n; j ++)
            {
                if(i == j || (i + j == n - 1))
                {if(grid[i][j] != 0) k ++;}
                else if (grid[i][j] == 0) k ++;
            }
        }
        if(k == n * n)return true ;
        else return false;
    }
};

二.统计放置房子的方式数

1.原题链接:力扣

2.解题思路:街道两侧的地块如何放房子是相互独立的事件,不会受彼此的影响,因而只需要算其中一侧的总情况再平方即可。把f(i)看成前i块地(包括第i块地)放置房子的方案数,对于第i个位置,有放房子和不放两种可能性:若不放房子,那么第(i-1)个地块可放可不放,则有 f[i] = f[i-1];若放房子,那么第(i-1)个地块无法放房子,第(i-2)个地块可放可不放,则有 f[i] = f[i-2]。因此f[i] = f[i-1] + f[i-2]。
3.参考代码:

class Solution {
public:
    int countHousePlacements(int n) {
        vector<long>f(n + 2);
        f[1] = 2;
        f[2] = 3;
        int mod = 1e9 + 7;
        for(int i = 3; i <= n; ++i)
        {
            f[i] = (f[i - 1] + f[i - 2]) % mod;
        }
        return f[n] * f[n] % mod;
    }
};

三.拼接数组的最大分数

1.原题链接:力扣

2.解题思路:交换后的sumnums1等于交换前的sumnums1加上nums2[i]-nums1[i]同理,交换后的sumnums2等于交换前的sumnums2加上nums1[i]-nums2[i]。需要让交换后的数组的总和最大,一定是让某个区间两个数组的diff差值最大,我们可以将这个diff差值看成一个新的数组arr[],arr[i] = nums1[i] - nums2[i]或nums2[i] - nums1[i],这样问题就转换成了对于一个数组arr[],我们如何求这个数组的最大连续子数组和问题,按照DP的方式递推求解即可。

3.参考代码:

class Solution {
    int maxSubarraySum(vector<int>& a, vector<int>& b){
    int n = a.size();
    int arr[n];
    int x;
    int maxsum = 0, f = 0;
    for(int i = 0; i < n; i++){
        arr[i] = a[i] - b[i];
    }
    for(int x : arr){
        f = max(f + x, 0);
        maxsum = max(maxsum,f);
    }
    return maxsum;
}

public:
    int maximumsSplicedArray(vector<int>& nums1, vector<int>& nums2) {
        int sumnums1 = 0,sumnums2 = 0;
        int n = nums1.size();
        for(int i = 0; i < n; i++){
            sumnums1 += nums1[i];
            sumnums2 += nums2[i];
        }
        sumnums1 += maxSubarraySum(nums2,nums1);
        sumnums2 += maxSubarraySum(nums1,nums2);
        return max(sumnums1,sumnums2);
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
力扣第二题是一道链表相关的题目,要求实现一个函数来将两个非负整数链表相加,并返回一个新的链表表示它们的和。 在解决这个问题时,可以设立一个表示进位的变量carried,并建立一个新的链表来存储结果。然后,使用while循环来同时处理两个输入链表,每次取出对应的节点值相加,并将结果加上进位值carried后的值作为一个新节点加入新链表的后面。当遍历完两个链表后,如果最后还有进位,需要再添加一个节点来存储进位的值。最后返回新链表的头节点即可。 下面是使用Java语言编写的实现代码: ```java public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0); int sum = 0; ListNode cur = dummy; ListNode p1 = l1, p2 = l2; while (p1 != null || p2 != null) { if (p1 != null) { sum += p1.val; p1 = p1.next; } if (p2 != null) { sum += p2.val; p2 = p2.next; } cur.next = new ListNode(sum % 10); sum /= 10; cur = cur.next; } if (sum == 1) { cur.next = new ListNode(1); } return dummy.next; } } ``` 以上就是力扣两数相加第二题的Java实现代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Java版】LeetCode 力扣第 2 题:两数相加 (Add Two Numbers)](https://blog.csdn.net/monokai/article/details/108132843)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值