110,477
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication3
{
//最大值外坐标
class MaxItem
{
private int x;
private int y;
public MaxItem(int x, int y)
{
this.x = x;
this.y = y;
}
public int X { get { return x; } }
public int Y { get { return y; } }
}
//自定义数组
class CArry : IEnumerable<int>
{
private int[,] m_Arr;
//最大值的组
private List<MaxItem> m_MaxItems;
private int m_MaxValue;
private int m_X, m_Y;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="x">x长度</param>
/// <param name="y">y长度</param>
public CArry(int x, int y)
{
m_Arr = new int[x, y];
m_X = x;
m_Y = y;
m_MaxItems = new List<MaxItem>();
m_MaxValue = 0;
}
public int XLength { get { return m_X; } }
public int YLength { get { return m_Y; } }
public int this[int x, int y]
{
get
{
if ((x >= m_X) || (y >= m_Y))
throw new IndexOutOfRangeException("索引超出了数组界限。");
return m_Arr[x, y];
}
set
{
if ((x >= m_X) || (y >= m_Y))
throw new IndexOutOfRangeException("索引超出了数组界限。");
orderByValue(x, y, value);
}
}
public int MaxValue { get { return m_MaxValue; } }
public IList<MaxItem> MaxItems()
{
return m_MaxItems;
}
//这个区间周围怎么变就怎么变
private void orderByValue(int x, int y, int value)
{
//当前最大值比改变值要大
if (m_MaxValue > value)
{
int item = m_MaxItems.FindIndex(r => r.X == x && r.Y == y);
if (item > -1)
{
m_MaxItems.RemoveAt(item);
}
m_Arr[x, y] = value;
//所有最大值都已死掉
if (m_MaxItems.Count == 0)
{
m_MaxValue = 0;
for (int i = 0; i < m_X; i++)
for (int j = 0; j < m_Y; j++)
{
if (m_MaxValue < m_Arr[i, j])
{
m_MaxItems.Clear();
m_MaxValue = m_Arr[i, j];
m_MaxItems.Add(new MaxItem(i, j));
}
else if (m_MaxValue == m_Arr[i, j])
{
m_MaxItems.Add(new MaxItem(i, j));
}
}
}
}
//改变值与目前值一样
else if (m_MaxValue == value)
{
m_Arr[x, y] = value;
m_MaxItems.Add(new MaxItem(x, y));
}
//改变值中产生新的最大值
else
{
m_MaxValue = value;
m_MaxItems.Clear();
m_Arr[x, y] = value;
m_MaxItems.Add(new MaxItem(x, y));
}
}
#region IEnumerable<int> 成员
public IEnumerator<int> GetEnumerator()
{
foreach (var valuei in m_Arr)
{
yield return valuei;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
class Program
{
static void Main(string[] args)
{
Random dr = new Random();
int x= 500, y = 500;
CArry arr = new CArry(x, y);
for (int i = 0; i < x; i++)
{
for (int j = 0; j <y; j++)
{
arr[i, j] = dr.Next(1, 100000);
}
}
Console.WriteLine("初始拥有最大的项:");
foreach (var i in arr.MaxItems())
{
Console.WriteLine("x:{0}y:{1}。", i.X, i.Y);
}
Console.WriteLine("初始最大值:{0}", arr.MaxValue);
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 20; i++)
for (int j = 0; j < 30; j++)
{
arr[400 + i, 200 + j] = dr.Next(9930, 10000);
}
Console.WriteLine("第二次运算时间:{0}", sw.Elapsed);
Console.WriteLine("第二次有最大的项:");
foreach (var i in arr.MaxItems())
{
Console.WriteLine("x:{0}y:{1}。", i.X, i.Y);
}
Console.WriteLine("现在最大值:{0}", arr.MaxValue);
Console.ReadKey();
}
}
}
看到是google的算法题,我又重新修改了一下,我这样的算法对吗,还是我理解错了,
存数入自定义数组=>在存入或改变的时候查看是否最大值或是最小值,免去多次循环 //这个区间周围怎么变就怎么变
private void orderByValue(int x, int y, int value)
{
//m_MaxItems m_MaxValue这里运算
if (m_MaxValue > value)
{
int item = m_MaxItems.FindIndex(r => r.X == x && r.Y == y);
if (item >-1)
{
m_MaxItems.RemoveAt(item);
}
m_Arr[x, y] = value;
}
else if (m_MaxValue == value)
{
m_Arr[x, y] = value;
int item = m_MaxItems.FindIndex(r => r.X == x && r.Y == y);
m_MaxItems.Add(new MaxItem(x, y));
}
else
{
m_MaxValue = value;
m_MaxItems.Clear();
m_Arr[x, y] = value;
int item = m_MaxItems.FindIndex(r => r.X == x && r.Y == y);
m_MaxItems.Add(new MaxItem(x, y));
}
}
//最大值外坐标
class MaxItem {
private int x;
private int y;
public MaxItem(int x, int y)
{
this.x = x;
this.y = y;
}
public int X { get { return x; } }
public int Y { get { return y; } }
}
//自定义数组
class CArry : IEnumerable<int>
{
private int[,] m_Arr;
//最大值的组
private List<MaxItem> m_MaxItems;
private int m_MaxValue;
private int m_X, m_Y;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="x">x长度</param>
/// <param name="y">y长度</param>
public CArry(int x, int y)
{
m_Arr = new int[x, y];
m_X = x;
m_Y = y;
m_MaxItems = new List<MaxItem>();
m_MaxValue = 0;
}
public int XLength { get { return m_X; } }
public int YLength { get { return m_Y; } }
public int this[int x, int y]
{
get
{
if ((x >= m_X) || (y >= m_Y))
throw new IndexOutOfRangeException("索引超出了数组界限。");
return m_Arr[x, y];
}
set {
if ((x >= m_X) || (y >= m_Y))
throw new IndexOutOfRangeException("索引超出了数组界限。");
orderByValue(x, y, value);
}
}
public IList<MaxItem> MaxItems()
{
return m_MaxItems;
}
//这个区间周围怎么变就怎么变
private void orderByValue(int x, int y, int value)
{
//m_MaxItems m_MaxValue这里运算
}
//IEnumerable<int> 成员